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的引用指向栈帧内存,而当方法调用过后,指针指向的内存上写的是什么数据就不确定了。