通过在块中使用weakSelf,你可以避免保留循环。但有时你应该保持weakSelf直到阻塞,因此你需要使用strongSelf,就像
一样__weak __typeof__(self) weakSelf = self;
dispatch_group_async(_operationsGroup, _operationsQueue, ^
{
__typeof__(self) strongSelf = weakSelf;
[strongSelf doSomething];
[strongSelf doSomethingElse];
} );
我想知道当weakSelf为零时,我们应该添加__strong typeof(self) strongSelf = weakSelf
答案 0 :(得分:5)
示例:如果你的阿姨问你,"请在我出发前往市场购买雨伞"。你去了市场,很难找到一把雨伞。最后你在几个小时后找到了一把漂亮的雨伞,然后你到家了,但是你发现你的姨妈已经离开了,你感觉很糟糕。但这对你的阿姨来说是正确的,因为飞行比伞更重要。
但是在您的编码问题中,您尝试做的事情是 你正在参观市场并随身携带姨妈的护照,这样她就不会离开,直到你回来。
我觉得这很粗鲁,但如果您仍想这样做,请使用self
代替strongSelf
dispatch_group_async(_operationsGroup, _operationsQueue, ^
{
[self doSomething];
[self doSomethingElse];
} );
答案 1 :(得分:2)
这一切都取决于您的要求。没有人,正确答案。
弱地捕获self
允许实例被释放,即使块仍然保留在某处。如果在执行块之前释放self
,则块中的nil
将为self
。
如果在self
已被解除分配时该块不应执行任何操作,则没有理由强烈捕获nil
。只需测试self
并提前退出。或者在不对self
采取行动的块中做任何需要的工作。
如果self
在块执行之前不应消失,请强烈捕获self
,但要确保self
没有对块的强引用,以避免保留周期。
如果self
在块开始执行之前消失是正常的,但必须坚持到块完成,该块应捕获对弱捕获sizeof
的强引用什么时候开始。
答案 2 :(得分:0)
如果问题是:“当weakSelf为零时。”
答案是:当没有人拥有自我的实例时
例如,您有一个名为vc
的{{1}}实例,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
实例将被取消, weakSelf将为零。
当apiHandler
在后台线程中查询成功并调用successCallback
时,消息doSomething
将发送到nil
对象。 (僵尸)
这就是为什么你需要像你说的那样在块中使用strongSelf。