美文网首页
iOS block 为什么官方文档建议用 copy 修饰

iOS block 为什么官方文档建议用 copy 修饰

作者: z_hy | 来源:发表于2022-03-01 17:11 被阅读0次

    一、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来实现的
    

    相关文章

      网友评论

          本文标题:iOS block 为什么官方文档建议用 copy 修饰

          本文链接:https://www.haomeiwen.com/subject/kyexrrtx.html