当weakSelf在块中为零时,应该添加strongSelf

时间:2017-01-24 07:47:14

标签: ios objective-c

通过在块中使用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

3 个答案:

答案 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拥有apiHandlerapiHandler拥有successCallbacksuccessCallback拥有vc

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

像这样:

- (void)doQuery {
    __weak __typeof__(self) weakSelf = self;

    self.apiHandler.successCallback = ^{
        [weakSelf doSomething];
    };
}

现在,如果vc被弹出或解散,vc实例将被取消, weakSelf将为零

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

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