通过在块中使用弱自我,您可以避免保留循环。但是有时你应该保持弱自我直到块保留,因此你需要使用强自我就像
__weak __typeof__(self) weakSelf = self;
dispatch_group_async(_operationsGroup, _operationsQueue, ^
{
__typeof__(self) strongSelf = weakSelf;
[strongSelf doSomething];
[strongSelf doSomethingElse];
} );
我想知道什么时候弱自我会为零,那么我们应该添加__strong typeof(self) strongSelf = weakSelf
例如:如果你的阿姨问你,"请在我出发前从市场上购买雨伞"。你去了市场,很难找到雨伞。几个小时后,你终于找到了一把漂亮的雨伞,你回到家,但你发现你的阿姨已经离开了,你感觉很糟糕。但对你阿姨来说,这是正确的事情,因为飞行比雨伞更重要。
但是在你的编码问题中,你想做的是你正在逛市场,带上你阿姨的护照,这样她就不会离开,直到你回来。
我想这很粗鲁,但如果你仍然想这样做,请使用self
而不是strongSelf
dispatch_group_async(_operationsGroup, _operationsQueue, ^
{
[self doSomething];
[self doSomethingElse];
} );
这完全取决于您的要求。 没有人,正确的答案。
捕获self
弱允许解除分配实例,即使块仍保留在某个位置。 如果在执行块之前释放self
,则会在块内nil
。
如果区块在已经解除分配self
时不应该做任何事情,那么就没有理由强烈地捕获self
。 只需测试nil
并提前退出。 或者在块中做任何不需要的工作,这些工作不会对self
起作用。
如果在块执行之前不应self
消失,请强烈捕获self
,但通过确保self
没有对块的强引用来避免保留周期。
如果self
在块开始执行之前消失是可以的,但必须一直存在到块完成,则块应该在开始时捕获对弱捕获self
的强引用。
如果问题是:"当弱自我将为零时"。
答案是:当没有人拥有自我的实例时
例如,您有一个名为 vc
的UIViewController
实例,vc
具有名为 apiHandler
的查询 API 的依赖项,api
有一个名为 successCallback
的回调块。
喜欢这个:
@interface ApiHandler: NSObject
@property (nonatomic, copy) void (^successCallback)();
@end
@interface vc : UIViewController
@property (nonatomic, strong) ApiHandler *apiHandler;
@end
@implementation vc
- (void)doQuery {
self.apiHandler.successCallback = ^{
[self doSomething];
};
}
- (void)doSomething {
}
如果vc
弹出或关闭,则vc
实例将不会是 dealloc。因为保留周期。
vc
自己的apiHandler
,apiHandler
自己的successCallback
,successCallback
自己的vc
。
因此,在块中使用弱vc
可以避免保留周期。
喜欢这个:
- (void)doQuery {
__weak __typeof__(self) weakSelf = self;
self.apiHandler.successCallback = ^{
[weakSelf doSomething];
};
}
而现在,如果你的vc
是弹出或关闭,vc
实例将是 dealloc,而 weakSelf 将是零。
当apiHandler
后台线程中查询成功并调用successCallback
时,消息doSomething
将发送到nil
对象。(僵尸)
这就是为什么你需要像你说的那样在块中使用strongSelf。