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

Objective c 为什么不抛出保留周期警告?,objective-c,memory-leaks,objective-c-blocks,retain-cycle,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 {

我使用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];
    }];
}
为什么不在那里抛出retain cycle警告?我是否应该每次在块中使用
self
时都对
self
使用弱引用


我还启用了
在块内隐式保留self
警告,它给了我100个警告,并建议我在块中编写
self->ivar.prop
(而不是
ivar.prop
)。在默认情况下禁用该警告后,我是否应该这样做?

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


代码示例:

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

代码示例:

为什么不在那里抛出retain cycle警告

块会保留您,但您不会保留块。动画完成后,它将被销毁。所以,没有周期

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

如果你的区块没有被自动销毁(例如,一个循环计时器),那么你应该

在默认情况下禁用该警告后,我是否应该这样做

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

但基本上,如果你的积木没有得到保存,你就没事了

另见

为什么不在那里抛出retain cycle警告

块会保留您,但您不会保留块。动画完成后,它将被销毁。所以,没有周期

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

如果你的区块没有被自动销毁(例如,一个循环计时器),那么你应该

在默认情况下禁用该警告后,我是否应该这样做

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

但基本上,如果你的积木没有得到保存,你就没事了

另见

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

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

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


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

感谢您的澄清。我错过了只有在存储时才会保留的块。一个块“长寿”意味着什么?所有块都有有限的代码行,因此它最终将退出。感谢您的澄清。我错过了只有在存储时才会保留的块。一个块“长寿”意味着什么?所有块都有有限的代码行,因此它最终将退出。