Block
1.是一段代码块,只在被调用的时候执行(类似于方法和函数)
2.是一种数据类型(类似于’int’,’NSString’)
3.可以定义成临时变量
4.可以当做参数传递
5.可以定义成属性
6.是一种匿名函数(重要,只有函数体,没有函数名)
7.是一个指向函数的指针(一个指针对象,block的名字就是指针的地址)
8.因为block代码块的内部没有修改和访问外部的变量,所以函数体不会发生变化,就像NSString一样,定义的变量都保存在常量区,不会随着定义的数量而增大空间的开辟,所以定义多个相同的代码块也一样,都会保存在常量区,前提是定义的代码块内部不发生改变
9.只要代码块的函数体不发生变化,无论是ARC还是MRC它的存储区域是一样的,都是常量区
10.当代码块函数体发生变化的时候,例如访问或者修改外部变量
int num = 10;
void(^block)() = ^{
NSLog(@"%d",num);
};
NSLog(@"%d",block);
如果是ARC(一般都会自动)在堆区 NSMallocBlock
在ARC环境下,编译器会根据情况自动将栈上的block复制到堆上的几种情况?
- 1.block作为函数返回值时
- 2.将block赋值给__strong指针时
- 3.block作为Cocoa API中方法名含有usingBlock的方法参数时
- 4.block作为GCD API的方法参数时
如果是MRC(手动)在栈区 NSStackBlock
11.block属性为什么要使用copy?
定