【问题标题】:Why the retain cycle warning not thrown?为什么没有抛出保留周期警告?
【发布时间】:2013-09-27 10:50:31
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    为什么没有在那里抛出保留周期警告?

    块留住你,但你不留住块。动画完成后将被销毁。所以,没有循环。

    每次我在块中使用 self 时是否应该对 self 使用弱引用?

    如果您的块没有被自动销毁(例如循环计时器),那么您应该这样做。

    在默认情况下禁用该警告后我应该这样做吗?

    取决于上下文。同样,如果您的块存在很长时间,您可能需要声明非保留weakSelf

    但基本上,如果你的积木没有被保存在某个地方,你就没事了。

    另见How do I avoid capturing self in blocks when implementing an API?

    【讨论】:

    • 感谢您的澄清。我错过了该块仅在存储时才保留。
    • 块“长寿”是什么意思?所有块的代码行数都是有限的,因此它最终会退出。
    【解决方案2】:

    这不是保留周期。这是两个在循环中相互调用的方法。当两个对象实例相互之间具有永不中断的强(保留)引用,并且这两个对象不必要地保留在内存中时,就会发生保留循环。

    代码示例:Retain cycle in ARC

    【讨论】:

      【解决方案3】:

      每次我在块中使用 self 时是否应该对 self 使用弱引用?

      绝对不是。块保留捕获的对象指针是有原因的——让对象保持活动状态,直到块运行时它们仍然存在。如果没有保留周期并且没有其他东西保留对self 指向的对象的引用,则可以在块运行之前将其释放(例如异步)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-25
        • 2013-09-18
        • 1970-01-01
        • 2023-03-19
        • 2016-05-03
        • 1970-01-01
        • 2012-12-24
        • 2010-10-21
        相关资源
        最近更新 更多