当我在自己保留的区块中调用自我时,我通常会收到警告:
[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
答案 0 :(得分:5)
只要您的weakSelf
为declared outside your block,就没有保留周期。
使用块内的对象隐式增加保留计数。但是您要在 aMethod
而不是weakSelf
上调用self
,因此保留计数不会受到影响。
答案 1 :(得分:2)
您应该在块外宣布__weak
到self
:
__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
指令,它也可以捕获那个。