代码之家  ›  专栏  ›  技术社区  ›  cream-corn

ARC、自身和块

  •  8
  • cream-corn  · 技术社区  · 11 年前

    我想我理解了self在被复制的块中的用法 不不 .

    但为了清理我的代码,我在Xcode中启用了一系列警告,其中一个叫做“向弱指针发送消息”

    所以现在在我所有的街区里,每次我使用我创造的 weakself 参考 __weak typeof(self) weakself = self;

    我收到警告: Weak receiver may be unpredictably set to nil

    一个微不足道的例子:

    __weak typeof(self) weakself = self;
    [aClass doSomethingInABlock:^{
    
         [weakself doSomething]; //warning.
    
    }];
    

    我看到了这样的答案,这些答案定义了区块内的自我:

    __weak typeof(self) weakself = self;
    [aClass doSomethingInABlock:^{
         typeof(self) selfref = weakself; 
         [selfref doSomething]; //no warning.
    
    }];
    

    所以我想知道这里到底发生了什么:

    • 我只是在欺骗编译器吗?
    • 强引用对弱引用有什么作用?
    • 我还缺什么。

    谢谢

    3 回复  |  直到 11 年前
        1
  •  8
  •   Community CDub    4 年前

    我想我明白在街区里使用self是一个no no。

    这并不严格正确。块保留其中的对象,因此不要使用 self 在一个街区 如果您的区块由 自己 .

    例如,您可以使用 自己 在UIView动画块中很好。这是因为视图控制器(或调用动画的任何代码)没有指向UIView动画块的指针。)

    我只是在欺骗编译器吗?

    强引用对弱引用有什么作用?

    如果弱引用不是 nil ,接收机的保留计数增加。这将阻止在使用对象时释放该对象。

    记住,当不再有对对象的强引用时,ARC将释放对象。通过在块内创建一个强引用,您可以在完成之前防止可能的释放。

    我还缺什么。

    我建议您阅读 Practical Memory Management section 高级内存管理编程指南。特别是,请阅读“使用弱引用避免保留周期”小节。

        2
  •  3
  •   Merlevede    11 年前

    请记住,在ARC中,只要存在 坚强的 参考它。

    当一个对象具有弱引用时,该对象可能会被释放(如果没有其他对同一对象的强引用),因此弱引用不能确保对象的生命。

    通过这样做:

    typeof(self) selfref = weakself; 
    

    你要确保你有 坚强的 在使用该对象之前引用该对象( selfref 是指向同一对象的强引用 weakself 是指)。如果不这样做,对象 能够 在您使用它时被解除分配。

        3
  •  3
  •   Avt    11 年前

    对弱引用的强引用保留对象。在以下情况下可能很重要

    __weak typeof(self) weakself = self;
    [aClass doSomethingInABlock:^{
    
         [weakself allocateSomething]; // (1)
         // ..... code (2)
         [weakself freeSomething];  // (3)
    }];
    

    如果弱接收器在第(2)行不可预测地设置为零,则资源可以在(1)中成功分配,但在(3)中不能释放。为了避免此类问题,可以使用强有力的参考。

    [aClass doSomethingInABlock:^{
         typeof(self) selfref = weakself; 
         [selfref allocateSomething]; // (1)
         // ..... code (2)
         [selfref freeSomething]; // (3)
    }];
    

    现在,如果self-ref在(1)中不为零,则在(2)和(3)中也有效。

    推荐文章