这是保留周期吗?

时间:2013-01-23 12:24:53

标签: ios objective-c cocoa-touch

当我在自己保留的区块中调用自我时,我通常会收到警告:

[self.someView doSomething:^{
        self.aVar = @"Hello!";
    }];

我必须这样做:

        __weak SomeObject *weakSelf = self;
[self.someView doSomething:^{
        weakSelf.aVar = @"Hello!";
    }];

但是如果我在weakSelf上调用一个方法,并且该方法使用self,即使我没有得到警告,这会导致保留周期吗?我在说这个:

        __weak SomeObject *weakSelf = self;
[self.someView doSomething:^{
        weakSelf.aVar = @"Hello!";
        [weakSelf aMethod];
    }];

和aMethod使用self

2 个答案:

答案 0 :(得分:5)

只要您的weakSelfdeclared outside your block,就没有保留周期。

使用块内的对象隐式增加保留计数。但是您要在 aMethod 而不是weakSelf上调用self,因此保留计数不会受到影响。

答案 1 :(得分:2)

您应该在块外宣布__weakself

__weak SomeObject *weakSelf = self;
[self.someView doSomething:^{
     weakSelf.aVar = @"Hello!";
     [weakSelf aMethod];
}];

否则编译器已经保留了self,因为它与块一起使用。

Beter甚至使用__block指令,因为__weak仅适用于iOS 5及更高版本。

__block SomeObject *weakSelf = self;
[self.someView doSomething:^{
     weakSelf.aVar = @"Hello!";
     [weakSelf aMethod];
}];

关于调用self并导致retain的其他方法,我从未见过这种行为。我总是使用__block指令,它也可以捕获那个。