一、block 的三种类型
block 三种类型:全局 block,堆 block、栈 block。
全局 block(NSGlobalBlock):没有访问外界局部变量的 block 就是全局 block,存储在全局区。
堆 block(NSMallocBlock):对栈 block 进行 copy 操作返回的就是堆 block,存储在堆区。
栈 block(NSStackBlock):访问了外界普通局部变量的 block 就是栈 block,存储在栈区。
二、block 建议用 copy 而不用 retain/strong 的原因
block 本质上是一个OC对象,内部有个 isa 指针,可以用 retain/strong/copy 等修饰词修饰。但是 block 在创建的时候内存默认分配在栈上,而不是堆上的。所以它的作用域仅限创建时候的作用域内,当你在该作用域外调用该 block 时,程序就会崩溃。
1.一般情况下你不需要自行调用copy或者retain一个block. 只有当你需要在block定义域以外的地方使用时才需要copy. Copy将block从内存栈区移到堆区
2.其实block使用copy是MRC留下来的也算是一个传统吧, 在MRC下, 如上述, 在方法中的block创建在栈区, 使用copy就能把他放到堆区, 这样在作用域外调用该block程序就不会崩溃
3.但在ARC下, 使用copy与strong其实都一样, 因为block的retain就是用copy来实现的
网友评论