查看答案
-
NSGlobaleBlock
全局的Block.未使用局部变量的Block
-
NSMallocBlock
在进程堆创建的Block 通过Copy之后的Block
-
NSStackBlock
在进程栈创建的Block,使用局部变量并未copy操作的
查看答案
因为默认情况下,Block会将访问的变量的值copy一份值而不是变量的内存地址到Block结构体中。从而默认在Block默认情况下无法修改外部变量的值。
Block访问__block修饰的变量,会通过__forwarding基数将外部的变量copy一份内存地址到Block结构体内部,从而可以修改外部的变量。
查看答案
Block是对象,封装了一块代码,可以在任何时候运行。Block可以作为方法参数,也可以作为方法返回值。自己又带有参数和返回值,和代理的功能相同。
查看答案
- Block
代码更加的紧凑,使用方便
-
Delegate
方法语义明显,适合作为作为第三方接口
查看答案
__block 修饰的变量可以在Block内部进行修改,__weak修饰的对象可以在Block使用防止循环引用。