好的,我们知道如果我们这样做,我们可能会有一个保留周期
[someObject messageWithBlock:^{ [self doSomething]; }];
并且解决方案是这样的
__weak typeof(self) weakSelf = self;
[someObject messageWithBlock:^{ [weakSelf doSomething]; }];
但是,如果我们这样做最后一个代码但doSomething有很多自我引用呢?像:
- (void) doSomething {
self.myProperty = @"abc";
[self doOtherThing];
}
这会创建保留周期吗?
这是怎么回事:
__weak typeof(self) weakSelf = self;
[someObject messageWithBlock:^{
self.onError(NSLocalizedStringFromTable(@"Error", MY_TABLE, nil))
}];
MY_TABLE是#define
?
答案 0 :(得分:1)
保留周期。当超出范围时,ARC会将保留计数减少。但是如果我们对一个对象有超过1个强引用,则保留循环。
(i)要删除保留周期,请始终在块的情况下特别采用对象的弱引用。因为块创建了一个单独的对象副本我喜欢你所做的:
__weak typeof(self) weakSelf = self;
[someObject messageWithBlock:^{
[weakSelf doSomething];
}];
(ii)功能不是任何问题
- (void) doSomething {
self.myProperty = @"abc";
[self doOtherThing];
}
答案 1 :(得分:1)
此代码中没有保留周期:
__weak typeof(self) weakSelf = self;
[someObject messageWithBlock:^{ [weakSelf doSomething]; }];
- (void) doSomething {
self.myProperty = @"abc";
[self doOtherThing];
}
<强>解释强>
在上面的代码中
[weakSelf doSomething];
表示接收器对象(self)现在变弱了自己。在 doSomething 中对self的任何调用都将引用weakSelf。 因此,在doSomething中引用self不会创建保留周期。
谈论以下代码:
__weak typeof(self) weakSelf = self;
[someObject messageWithBlock:^{
self.onError(NSLocalizedStringFromTable(@"Error", MY_TABLE, nil))
}];
由于块内的接收器对象是 self ,而不是weakSelf,这将创建一个保留周期。