Hea*_*ers 3 objective-c objective-c-blocks automatic-ref-counting
众所周知,block如果block隐含地保留也保留了对象,则a 可以诱导保留周期block.例:
self.block = ^{
[self foo];
};
Run Code Online (Sandbox Code Playgroud)
通常规定的解决方法是简单地使用a __weak self来避免保留周期:
__typeof(self) __weak weakSelf = self;
self.block = ^{
[weakSelf foo];
};
Run Code Online (Sandbox Code Playgroud)
但是,如果self在执行过程中被释放,则会导致问题foo.更好的策略是捕获块内本地的__strong引用__weak self.但是,我不知道是否__weak捕获了修饰符__typeof,如果是,我可以用另一个覆盖__strong吗?
所以,其中一个是正确的,但是哪个?
一个
__typeof(self) __weak weakSelf = self;
self.block = ^{
__typeof(self) strongWeakSelf = weakSelf;
[strongWeakSelf foo];
};
Run Code Online (Sandbox Code Playgroud)
乙
__typeof(self) __weak weakSelf = self;
self.block = ^{
__typeof(self) __strong strongWeakSelf = weakSelf;
[strongWeakSelf foo];
};
Run Code Online (Sandbox Code Playgroud)
C
__typeof(self) __weak weakSelf = self;
self.block = ^{
__typeof(weakSelf) strongWeakSelf = weakSelf;
[strongWeakSelf foo];
};
Run Code Online (Sandbox Code Playgroud)
d
__typeof(self) __weak weakSelf = self;
self.block = ^{
__typeof(weakSelf) __strong strongWeakSelf = weakSelf;
[strongWeakSelf foo];
};
Run Code Online (Sandbox Code Playgroud)
我希望C是正确的,因为它根本不在self里面block,并且不需要额外的__strong.
编辑
我完全搞砸了我最初的问题并且我的例子错了.在我的积木中,我以前的所有答案都不[weakSelf foo]是[strongWeakSelf foo].
C(几乎)是你想要的:
__typeof(self) __weak weakSelf = self;
self.block = ^{
__typeof(weakSelf) strongWeakSelf = weakSelf;
[strongWeakSelf foo]; //use strongWeakSelf, not weakSelf.
};
Run Code Online (Sandbox Code Playgroud)
该__strong或__weak 所有权预选赛是从不同的类型,你从中获取__typeof__().
B与A相同,C与D相同,因为局部变量是隐含的__strong.
但是,所有这些例子可能不会做你想要的!由于strongWeakSelf实际上并未使用,优化器可能能够将其删除.
此外,如果您正在测试其中任何一个,请注意objc_loadWeak当前用于读取的运行时函数weakSelf(当前)正在对其当前加载的值执行保留+自动释放.所以在实践中,每个例子都是同样安全的.但是,不能保证将来总是如此.
| 归档时间: |
|
| 查看次数: |
454 次 |
| 最近记录: |