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)
所以我想知道这里到底发生了什么:
谢谢.
我以为我理解在一个块中使用self是不可能的.
这不是严格正确的.块将对象保留在其中,因此如果块被保留,则不要self
在块中使用.self
例如,您可以self
在UIView动画块中使用得很好.这是因为您的视图控制器(或任何调用动画的代码)没有指向UIView动画块的指针.)
我只是欺骗编译器?
没有.
对弱引用的强引用有什么作用?
如果弱参考不是nil
,则接收器的保持计数增加.这将阻止对象在您使用时被释放.
请记住,当对象不再有强引用时,ARC将释放对象.通过在块内创建一个强引用,您可以防止可能的重新分配,直到您完成它.
我缺少的任何其他东西.
我建议阅读" 高级内存管理编程指南"中的" 实际内存管理"部分.特别是,请阅读"使用弱引用以避免保留周期"小节.
归档时间: |
|
查看次数: |
562 次 |
最近记录: |