编辑于winbook]
// OC中相对于C语言多出来的数据类型有 SEL id block BOOL等
block类型是一个C级别的语法和运行机制,它与标准的C函数类似,不同之处在于,它
除了有可执行代码以外,它还包含了与堆、栈内存绑定的变量。因此,block对象包含
着一组状态数据,这些数据在执行时用于对行为产生影响。
我们可以利用block来写一些可以传到API的函数语句,可选择性的存储,并可以使用
多线程。作为一个回调,block特别有用,因为block不仅包含了回调期间的代码,又
包含了执行期间需要的数据。
block同时兼容OC,C++,C。
[如何声明一个block变量]
用符号^来声明一个block变量,并且指明block语句的开始,block的主体部分包含
在{}内,以;标识语句的结束。
//格式范例: int (^blockName) (int) = ^(int name) {return name * 3;}
//格式解读: 返回类型(^块对象名称)(参数类型) = ^(参数类型 参数名称){语句};
// block调用方式和函数基本一致
//调用 块变量名();
}
// bloc最简单声明
// 无参无返回值
void (^testblock1)()=^(){//如果没有参数,等号右边可以去掉括号
NSLog(@"This is a block");
};
// 无参有返回值
int (^testblock2)()=^(){
return 12;
};
// 有参无返回值
void (^testblock3)(int)=^(int num){
NSLog(@"num x 2 = %d",num*2);
};
// 有参有返回值
int (^testblock4)(int)=^(int num){
return num+100;
};
testblock1();
int test = testblock2();
NSLog(@"test = %d",test);
testblock3(10);
int test2 = testblock4(80);
NSLog(@"test2 = %d",test2);
Person *p = [Person new];
[p test:^{
NSLog(@"这是将要被调用的Block方法");
}];
——————————————————————————————————
person.m
——————————————————————————————————
#import "Person.h"【在person.h中有对应方法声明,此处略】
@implementation Person
-(void)test:(void (^)())block{
if (block != nil) {
block();
NSLog(@"Block调用完成");
}
}
@end
[附录:实际上LZ本人很少使用block,感觉略眩晕- -尤其是block作为参数连续传递云云,表示摸不着头脑] |
|