Objective-C中Block的常见用法
1 typedef int(^AddValue)(int,int); 2 3 int main(int argc, const char * argv[]) { 4 @autoreleasepool { 5 //1:NSStackBlock 6 __block int curNum = 7;//如果block内想要修改外部声明的局部变量,则需要将该变量声明为__block类型,否则该变量是const类型的,不能再block内修改 7 int (^testBlock)(void) = ^(void){ 8 curNum++; 9 return curNum * 4; 10 }; 11 12 NSLog(@"testBlock:%d,curNum = %d",testBlock(),curNum); 13 14 //2:NSGlobalBlock 15 AddValue addValue = ^(int a,int b){ 16 a = a +b; 17 return a + b; 18 }; 19 int a = 3; 20 int b = 4; 21 NSLog(@"addvalue : %d a = %d, b = %d",addValue(a,b),a,b); 22 23 //3 24 void (^printString)(NSString *); 25 printString = ^(NSString *str){ 26 NSLog(@"printString:%@",str); 27 }; 28 printString(@"hello world"); 29 30 } 31 return 0; 32 }
打印结果:
testBlock:32,curNum = 8 addvalue : 11 a = 3, b = 4 printString:hello world
Block分为三种类型:
*1.NSGlobalBlock:不访问外部变量
*2.NSStackBlock:位于栈内存,访问结束后释放
*3.NSMallocBlock:位于堆内存
Block与方法的区别:
*1.都有返回值,
*2.参数列表
*3.可以保存代码,
*4.调用方式相同
可以使用typedof定义Block类型,好处是可以生命多个该Block类型的变量,而传统方式只能声明一个变量。
注意事项:
*1.Block可以访问外部变量
*2.Block内不能修改外部变量的值,除非在外部变量类型前用__block关键字(两个下划线哦)修饰
*3.copy。在类属性中,要使用copy
*4.block是Objective-C中的对象,但是跟已定义的类又有所不同,block默认在栈上分配,一般类的实例对象在堆上分配。Block对象在栈上分配,block的引用指向栈帧内存,而当方法调用过后,指针指向的内存上写的是什么数据就不确定了。