iOS11最新 - 零基础上手block

一.初识block

void (^testBlock)(void) = ^(){
        //最基本的block
};

这就是一个最简单的block,为了方便初学者记忆理解,我们再来用熟悉的方法/函数来对比理解:如果方法/函数都不熟,我的朋友你路还有点长啊(- -!)

- (void)test{
      //最基本的OC对象方法
}
  • 第一个void :返回值,方法的返回值可以用什么这儿也可以用什么,方法的返回值是干啥的,这也是一样(如果还理解不了,留言我们交流一下)。
  • ^被称作"脱字符",难记的话你就记住:每次出现block的地方加个"尖尖"。
  • testBlockblock的变量名,类比方法的方法名,想咋写咋写。
  • (void)block语法的参数列表。类比参数的参数列表。注意:iOS11之前没有参数写个()就可以了。但是iOS11空参数类型需要写个void。否则系统会给你个黄色警告
  • = ^(){ //最基本的block };这句话就是定义一个Block,给变量testBlock赋值。同理,方法里能写啥这就可以写啥(有个注意点,我在下边描述)。
    最基本的Block介绍完了,和方法一样我们在实际应用中肯定写这么个简单的玩意儿的,所以我贴一个稍微复杂点儿的定义Block代码(当然也就是个稍微了)
//func:拼接传入参数并返回
NSString* (^appendParameterBlock)(NSString* , int) = ^(NSString *name,int age){

    NSMutableString  *mutalStr = [NSMutableString string];
    [mutalStr appendFormat:@"%@同学今年%d岁了",name,age];
    return mutalStr;
};

二.如何定义Block

看完上边也就几十秒左右,你可能大概有个印象了。但是你可能现在默写一个Block还是有阻碍,这里我介绍两种方便又好记的方案

1.Xcode自带代码块inline

在写代码的地方写下inline这个单词,会出现个索引,敲回车:
PS:类方法、对象方法中都行

//blockName  :block的变量名。相当于int  a;里边的a
<#returnType#>(^<#blockName#>)(<#parameterTypes#>) = ^(<#parameters#>) {
    <#statements#>
};

看到没有,舒服又方便。这下你再对比上边的参数简介是不是印象又加深了一点。(作为Coder,上手写代码还是很重要的。初始Block的朋友我建议你敲一敲inline,效果更佳)。

2.别名typedef

在你写宏定义、#import的地方 写下typedefblock又会出现个索引,即:

//name  :Block类型别名
typedef <#returnType#>(^<#name#>)(<#arguments#>);     //索引

typedef void(^myBlock)(void);       //示例

这样也可以通过起别名定义一个Block类型。

注意:
  • typedef仅仅是为Block定义了一个别名。而在第一节里边写的name是变量名。这点必须认识清楚。
  • 空参数列表,还是要写个void,同样也是系统的黄色警告。
  • 帮助理解:
    就拿上边那个最简单的Block来举例void (^testBlock)(void) = ^(){};,这里block的类型就是void(^)(void),即空返回值空参数类型的block。你看这个东西就有点长,所以我们利用typedef来给他起个别名。这就是这个2用法的来源。(如果还是有疑问,留言我们交流一下)

三.使用Block

1. inline定义Block的使用

就用我们那个稍微稍微复杂的那个代码来举例使用

NSString *strPrint = appendParameterBlock(@"李华",13);
NSLog(@"%@",strPrint);
  • 传入的参数类型及顺序须与定义时候的时候一致

2.别名typedef使用

说到起别名,我们经常使用的NSInteger也其实是个long类型的别名。(你可以点cmd+左键点击进去看下头文件看一下),既然我们起了个别名。 那我们就像用NSInteger一样使用嘛。看代码

//1.起别名
typedef void(^myBlock)(int a);

//2.定义或者叫创建一个变量
myBlock block =  ^(int a ){
    NSLog(@"%@",a);
};

//3.使用
myBlock(2);

//4.打印结果:2

四.Block的作用

上边我在介绍的时候就是用方法/函数来类比的。那么作用其实也一样,Block就是保存一段代码,然后再恰当的时候调用。

五.什么时候使用Block

  • 用来传值。经典的就是两个页面之间的逆向传值。
  • 请求网络数据(延迟),先把展示到控件的代码先保存到Block,等请求到数据的时候直接调用Block。经典的:AFNetworking

六.拓展:与代理delegate的比较理解

其实我们通常有一个说法:
-block相当于一个小弟,当我有这个小弟的时候,随叫随到,想让他干什么就干什么。再通俗点:小弟你帮我先把这段代码保存起来,等用户点击页面的时候,再让小弟去做这个事情就可以了。

  • 代理delegate相当于打电话,通知你的代理人让他去做事情。
    当然了上边是一个很不严谨的类比。本文只是为了让初学者更快掌握这个东西。暂且这样理解着。等掌握了之后,再查资料进行深入了解。

七.注意点

通过在.h文件定义一个block,我们来叙述一些注意点

#import <UIKit/UIKit.h>
typedef void(^PersonBlock)(int a);

@interface Person : NSObject

@property (nonatomic, copy) myBlock    block;

@end

  • 修饰block请用copy。想知道原因请点击修饰block为什么要用copy delegate要用weak,查看第六条。
  • 定义block类型别名,我们约定:类名+block。当然你可以加上你block的功能描述单词。就好像我们约定OC命名用驼峰语法一样。
  • block可以当做对象使用,但他不是一个对象。所以变量名前边不要加*号。
  • 如果对象内部有一个Block属性,而在Block内部又访问了该对象,那么会造成循环引用。所以遇到问题请弱引用__weak typeof(p) weakP = p;

本文旨在让初学者可以快速上手block,如果掌握以后并且想再深入理解,推荐一篇博客深入理解Block

如果您有什么疑问或者发现书写歧义,非常感激您能留言~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,111评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,654评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,810评论 6 342
  • 尽管要交的英文报告还差几百字没有打完,而今天就是截止日期;尽管昨夜只睡了两个多小时,身体困乏疲累,但这些都不能阻挡...
    何如一醉尽忘机阅读 202评论 0 0
  • 2017/7/31。无为。焦点解决分享第19天。每个人都需要被关注,而且是关注的是成功d方面要多些,只有这样才能使...
    无为wyw阅读 141评论 0 0