为什么不抛出保留周期警告?

时间:2013-09-27 10:50:31

标签: objective-c memory-leaks objective-c-blocks retain-cycle

我使用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)。在默认情况下禁用警告后,我应该这样做吗?

3 个答案:

答案 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指向的对象的引用,则可以在块运行之前释放它(例如,异步)。