当弱自我将在块中为零时,何时应该添加强自我



通过在块中使用弱自我,您可以避免保留循环。但是有时你应该保持弱自我直到块保留,因此你需要使用强自我就像

__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的强引用。

如果问题是:"当弱自我将为零时"。

答案是:当没有人拥有自我的实例时

例如,您有一个名为 vcUIViewController实例,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自己的apiHandlerapiHandler自己的successCallbacksuccessCallback自己的vc

因此,在块中使用vc可以避免保留周期。

喜欢这个:

- (void)doQuery {
    __weak __typeof__(self) weakSelf = self;
    self.apiHandler.successCallback = ^{
        [weakSelf doSomething];
    };
}

而现在,如果你的vc是弹出或关闭,vc实例将是 dealloc,而 weakSelf 将是零

apiHandler后台线程中查询成功并调用successCallback时,消息doSomething将发送到nil对象。(僵尸)

这就是为什么你需要像你说的那样在块中使用strongSelf。

最新更新