1.直接使用时:
/**直接定义block * void (^whatTheFuck) (NSInteger a,NSInteger b) ; * | | | * 返回值 block名字 参数列表 */
apple官方的例子:
float (^oneFrom)(float); 1. 声明一个block对象 oneFrom = ^(float aFloat) { 2. 赋值,使该对象引用一个栈中的函数块 float result = aFloat - 1.0; 3.执行函数 return result; };
要将block视为oc的一种对象,而不做特殊声明时是一个局部变量,函数执行完后就会被回收
我个人没有这么使用过
2.作为属性使用时 :
贴上此demo的github link:
https://github.com/lyleLH/blockDemo
程序目的:完成一次vc1 push到vc2,vc2再pop回vc1时反向传值
1.appdelegate拥有一个viewcontroller类型的对象vc1 2.viewcontroller拥有一个viewController2类型的对象vc2
3.在viewController2中利用typedef 定义了一个block类型 :
/**typedef 一个类型(block) * typedef void (^useName) (UITextField * txf); * | | | | * 定义开始 返回值 类型名 参数列表 */
typedef void(^userName)(UITextField * txf);//定义一个block类型 ,无返回值,参数是一个UITextField对象
4.viewController2中有一个userName的block属性,
作为属性主要是为了保证在vc2中作为全局对象,并且在vc1中能够访问到此对象
@property (nonatomic,copy)userName userName;
5.当用户输入完毕,点击返回上一页时
会将文本框的作为参数传递给vc1
vc1中来获取次此文本框的文本并显示在lable上
此时在vc2中执行此block:
if(_userName) { _userName(self.texf); }
最好是加上是否不为nil的判断
此处是详细的抱错解读:
http://stackoverflow.com/questions/4145164/why-do-nil-null-blocks-cause-bus-errors-when-run
6.vc1中会开始执行vc2所拥有的block属性指向的函数块 :
- (void)viewDidLoad {
[super viewDidLoad];
self.vc2 = [[ViewController2 alloc] init];
__weak typeof(self) weakSelf = self;
self.vc2.useName = ^(UITextField * texf) { //会执行此函数块
NSLog(@"%@",texf.text);
mark.text = texf.text;
weakSelf.name = mark.text;
NSLog(@"self.nameIn with weak:%@",weakSelf.name);
}
6.作为属性使用时一定不要忘记一点:
在vc1中执行block时要确保vc2不能为空,
即注意我的vc1中block执行的代码是写在 self.vc2 = [[ViewController2 alloc] init] 之后的