ARC,自我和块

cre*_*orn 8 objective-c ios objective-c-blocks automatic-ref-counting retain-cycle

我以为我理解在复制的块中使用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.

}];
Run Code Online (Sandbox Code Playgroud)

我已经看到了在块中定义自我版本的答案,如下所示:

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

}];
Run Code Online (Sandbox Code Playgroud)

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

  • 我只是欺骗编译器?
  • 强引用弱引用有什么作用?
  • 我缺少的任何其他东西.

谢谢.

Aar*_*ger 8

我以为我理解在一个块中使用self是不可能的.

这不是严格正确的.块将对象保留在其中,因此如果块被保留,则不要self在块中使用.self

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

我只是欺骗编译器?

没有.

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

如果弱参考不是nil,则接收器的保持计数增加.这将阻止对象在您使用时被释放.

请记住,当对象不再有强引用时,ARC将释放对象.通过在块内创建一个强引用,您可以防止可能的重新分配,直到您完成它.

我缺少的任何其他东西.

我建议阅读" 高级内存管理编程指南"中的" 实际内存管理"部分.特别是,请阅读"使用弱引用以避免保留周期"小节.