1

我使用 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在块中使用时都应该使用弱引用吗?

我还启用了警告,它给了我 100 个警告,并建议我在块Implicit retain of self within blocks中写入self->ivar.prop(不是)。ivar.prop在默认情况下禁用该警告后我应该这样做吗?

4

3 回答 3

4

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

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

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

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

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

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

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

另请参阅在实现 API 时如何避免在块中捕获自我?

于 2013-09-27T11:21:27.733 回答
3

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

代码示例:在 ARC 中保留循环

于 2013-09-27T11:06:25.053 回答
0

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

Absolutely not. Blocks retain captured object pointers for a reason -- to keep the objects alive until so that they'll still be there when the block is run. If there is no retain cycle and there is no other thing keeping a reference to the object pointed to by self, it could be deallocated before the block is run (asynchronously, for example).

于 2013-10-04T09:50:32.710 回答