block 这个名词对于做一般开发者来说可能会觉得稀奇古怪而非常陌生,但是对于 iOS 工程师来说,在整个开发中到处都是它的影子,今天一大早觉得在假期学习一下它,对明年的 iOS 开发工作做个准备,突然有点找回当年即将毕业时的最后一个春节假期的感觉,今天基于最近使用的角度来学习总结一下 block。
block
- 是对象,它封装了一段代码,这段代码可以在任何时候执行。block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。它和传统的函数指针很类似,但是有区别:block是
- inline
- 的,并且它对局部变量是只读的,^是block语法的标识。
第一种方式:用 typedef 定义一个 block 类型
- typedef void (^Sucess)(NSString*);//用typedef定义一个block类型
- @property (nonatomic,copy) Sucess myBlock;
第二种方式:也可以通过标准的 block 函数体
- @property (nonatomic,copy) void(^myBlock)(NSString*);
完整的 block: NSString* (^callBack) (NSString *)
第一个参数:block 返回值
第二个参数:block 名字
第三个参数:block 回调参数
- NSString* (^callBack) (NSString *) =^(NSString *string){
- NSMutableString * tempString=[[NSMutableString alloc]initWithString:@"I wanna to know "];
- return [tempString stringByAppendingString:string];
- } ;
- NSString *result=callBack(@"who is lcj ?");
- NSLog(@"result ----> %@",result);
- int num=0;
- int (^plus) (int ,int )=^(int a,int b)
- {
- num=a+b;
- return num;
- };
- int finalNum=plus(5,6);
- NSLog(@"finalNum--->%d",finalNum);
比如上面这种方式是编译不通过的,block 可以访问局部变量,但是不能修改。如果要修改就要加关键字:__block,修改后如下
- __block int num=0;
- int (^plus) (int ,int )=^(int a,int b)
- {
- num=a+b;
- return num;
- };
- int finalNum=plus(5,6);
- NSLog(@"finalNum--->%d",finalNum);
循环引用就是当 self 拥有一个 block 的时候,在 block 又调用 self 的方法。形成你中有我,我中有你,谁都无法将谁释放的困局。举例说明:
在 block 中处理 viewController 的全局变量 str
- void(^dealString)(void)=^{
- self.str=@"who is lcj ?";
- };
- dealString();
如何解决?使用 weakSelf,换言之类似 Android 中的弱引用
- __weak typeof (self) weakSelf = self;
上面的修改成下面这种方式就可以解决循环引用问题
- __weak typeof (self) weakSelf = self;
- void(^dealString)(void)=^{
- weakSelf.str=@"who is lcj ?";
- };
- dealString();
今天大致总结了最近在开发中使用 block 的几个心得体会,后续更多 block 的高级使用再做总结。
来源: