Blocks
Ø Block介绍
一、Block是带有自动变量的匿名函数代码块,此代码块可以作为参数传递给其他对象。
二、Block与代理协议的功能一样,都是用于做事件通信的。
三、Block也相当于Objective -C里的一种数据类型,property声明时用copy。
四、回调:block会先执行函数调用语句,接着执行赋值语句,当block获取到数值后在回调block函数调用进行赋值。
五、Block使用了全局变量,会把全局变量所在的对象retain(持有),会产生循环引用。需要把对象设置为弱引用。__block Humanb *temHa = hA(Humanb*hA = [[Humanb alloc] init]);
Ø Block语法定义
一、Block变量定义:返回值(^变量名)(函数参数...);
void (^ myBlocks)(int); // 可以不传参数,但括号要写。
// typedef:给一个数据类型取别名,newBlock:类型新名,参数列表中最好变量名添加上。
typedef void (^ newBlock)(NSString *s);
Ø Block变量赋值(Block的实现):变量名 = 返回值^(参数列表){函数代码块....}
myBlock = ^void (int a, int b) { // 可以省略返回值(不包括插入符)。
NSlog(@”c = %d”,a + b);
};
Ø Block函数的调用
myBlock(10,20);
Ø 定义和实现合并
void (^ myBlock2)(int, int) = ^(int a, int b) {
/*
1. int a局部变量,在block的实现外面不能访问。
2. block调用时a变量才分配内存创建出来。
3. 外部的局部变量传入block之后,就被转换为常量,值不能修改。
4. __block修饰的变量可以在block的外部和内部访问。
*/
NSlog(@”myBlock = %d”,a + b);
}
Ø block作为方法参数,参数类型:void (^)(int)
- (void)methodUsingBlock:(void (^)(int))block;
- (void)methodUsingBlock:(newBlock)block; // 通过typedef定义的block类型传参数。
- (void)methodUsingBlock:(newBlock)block { // 实现methodUsingBlock方法
block(@“关羽”,@“张飞”); // 调用block
}
Ø methodUsingBlock 方法的调用
Person *per = [[Person alloc] init];
[Per methodUsingBlk:^(NSString *name1, NSString *name2) {
NSlog(@”%@,和%@”,name1,name2);
}]; // block的实现(赋值)。