我使用Xcode 5并有一些代码
@interface Controller {
__weak IBOutlet UIView *someView;
}
@implementation Controller {
- (void)doSomething
{
[UIView animateWithDuration:0.5 animations:^{
someView.hidden = YES;
}];
}
- (void)doSomething1
{
[UIView animateWithDuration:0.5 animations:^{
[self doSomething];
}];
}
为什么没有抛出保留周期警告?我应该每次self
使用弱引用我在块中使用self
吗?
此外,我启用了Implicit retain of self within blocks
警告,它给了我100条警告,并建议在块中编写self->ivar.prop
(不是ivar.prop
)。在默认情况下禁用警告后,我应该这样做吗?
答案 0 :(得分:4)
为什么没有抛出保留周期警告?
该块保留您,但您不保留该块。它会在动画完成后被销毁。所以,没有周期。
每次在块中使用self时,我应该在self上使用弱引用吗?
如果您的块没有被自动销毁(例如定期计时器),那么您应该。
默认情况下禁用该警告后我应该这样做吗?
取决于具体情况。同样,如果你的块活了很长时间,你可能想声明不保留的weakSelf
。
但如果你的积木没有得到保存,基本上你就没事了。
另见How do I avoid capturing self in blocks when implementing an API?
答案 1 :(得分:3)
这不是保留周期。这是在循环中相互调用的两种方法。当两个对象实例具有永远不会被破坏的强(保留)引用时,就会发生保留循环,并且这两个对象不必要地保留在内存中。
代码示例:Retain cycle in ARC
答案 2 :(得分:0)
每次在块中使用self时,我应该在self上使用弱引用吗?
绝对不是。块保留捕获的对象指针有一个原因 - 保持对象存活,直到它们在块运行时仍然存在。如果没有保留周期且没有其他东西保持对self
指向的对象的引用,则可以在块运行之前释放它(例如,异步)。