block

什么是Block?

block是对象,它封装了一段代码,这段代码可以在任何时候执行。block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。它和传统的函数指针很类似,但是有区别:block是inline的,并且它对局部变量是只读的,^是block语法的标识。

声明block

第一种方式:用typedef定义一个block类型

typedefvoid(^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);

block访问变量

intnum=0;

int(^plus) (int,int)=^(inta,intb)

{

num=a+b;

return num;

};

intfinalNum=plus(5,6);

NSLog(@"finalNum--->%d",finalNum);

比如上面这种方式是编译不通过的,block可以访问局部变量,但是不能修改。如果要修改就要加关键字:__block,修改后如下

__blockintnum=0;

int(^plus) (int,int)=^(inta,intb)

{

num=a+b;

return num;

};

intfinalNum=plus(5,6);

NSLog(@"finalNum--->%d",finalNum);

block循环引用

循环引用就是当self 拥有一个block的时候,在block 又调用self的方法。形成你中有我,我中有你,谁都无法将谁释放的困局。举例说明:

在block中处理viewController的全局变量str

void(^dealString)(void)=^{

self.str=@"who is lcj ?";

};

dealString();

如何解决?使用weakSelf,换言之类似Android中的弱引用

__weaktypeof(self) weakSelf = self;

上面的修改成下面这种方式就可以解决循环引用问题

__weaktypeof(self) weakSelf =self;

void(^dealString)(void)=^{

weakSelf.str=@"who is lcj ?";

};

dealString();

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容