Block的应用场景
对象与对象之间的通信方式
1.代理-协议 1对1
2.通知 1对多
3.Block 1对1 但不需要协议
三种通信方式都实现了对象之间的解耦合。
通知的通信方式是1对多; 代理、block是1对1
Block介绍
Block是iOS4.0之后新增的一种语法结构,也称为“闭包(closure)”。
SDK4.0新增的API大量使用了Block。
Block是一个匿名的函数代码块,此代码块可以作为参数传递给其他对象。
//Block的声明
//返回值 block变量 参数
int (^ myBlocks)(int);
//Block的创建
myBlocks= ^(int a){
int result = a * a;
return result;
};
//Block的调用
int ret = myBlocks(10);
Blocks和变量
变量按作用域分有全局变量和局部变量。
block代码块内可以引用这两种变量,但是有不同的管理机制。
引用局部变量
block引用局部变量时,该变量会作为常量编码到block块中。
局部变量需要使用__block修饰,才能在block块中修改。
Block的内存管理
1.在 block 里面引用一个局部的Objective-C 对象的时候,该对象会被 retain。
如果局部变量使用__block修饰,则不会被retain。
2. 在 block 里面引用一个实例变量时,该实例对象会被 retain。
block本身可以像对象一样copy和release。
block创建后内存是分配在栈上,调用copy方法,会将block从栈移到推上。
当block声明为全局变量时,我们应该调用block的copy方法。
两种copy方式
[_block copy];
Block_copy(_block);
两种release.方式
[_block release];
Block_release(_block);
Blocks的应用
将UIButton按钮的点击事件响应方法,改成block。
1.SDK提供的事件绑定
[button addTarget:self action:@selector(clickAction:)
forControlEvents:UIControlEventTouchUpInside];
2.block.方式
button.touchBlock = ^(UIButton *button) {
NSLog(@"按钮被点击了");
};
好处是不需要重新定义方法