加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ios – 在块中阻塞,__weak self

发布时间:2020-12-14 17:42:12 所属栏目:百科 来源:网络整理
导读:我想知道我是否做得对: 如果我有一个区块,我会这样做: __weak MyClass *weakSelf = self; [self performBlock:^{ // Should I use self,or weakSelf here? [weakSelf doSomething];} afterDelay:delay]; 但是如果块中存在块,会发生什么?这是正确的吗? __
我想知道我是否做得对:

如果我有一个区块,我会这样做:

__weak MyClass *weakSelf = self;  
[self performBlock:^{                 //<< Should I use self,or weakSelf here?

    [weakSelf doSomething];

} afterDelay:delay];

但是如果块中存在块,会发生什么?这是正确的吗?

__weak MyClass *weakSelf = self;
[self performBlock:^{

    [weakSelf doSomething];

    [self performBlock:^{

        [weakSelf doSomething]; 
    } afterDelay:1.0f];

} afterDelay:delay];

另外,在下面的功能中,我是否需要使用[块复制]?

- (void)performBlock:(void (^)(void))block afterDelay:(float)delay
{
    if (block)
    {
        if (delay > 0)
        {
            [self performSelector:@selector(executeBlockAfterDelay:) withObject:[block copy] afterDelay:delay];
        }
        else
        {
            [self executeBlockAfterDelay:[block copy]];
        }
    }
}

- (void)executeBlockAfterDelay:(void(^)(void))block
{
    if (block)
        block();
}

解决方法

在这种情况下(下面)使用强大的自我,因为块被复制只是几秒钟.通常如果你想要自我执行阻止,你希望它保持活着直到那个时候,所以强大的参考是完全可以的.

[self performBlock:^{
    [self doSomething]; // strong is OK
} afterDelay:delay];

块内阻塞?在你的情况下,这两个块只是延迟一次性块,所以与上面相同,使用强.但是块之间存在差异.如果您将块存储较长时间,也许对于多次调用,您应该避免保留周期.

例:

self.callback = ^{
    [self doSomething]; // should use weakSelf
};

这可能会导致保留周期.实际上,它取决于块的使用方式.我们看到该块被存储(复制)在属性中供以后使用.但是,您可以通过使不再使用的块无效来阻止保留周期.在这种情况下:

self.callback(); //invoke
self.callback = nil; //release

使用ARC时,您不必自己复制块.在添加块之后,早期版本中存在错误,但现在ARC下的编译器知道何时复制块.在这种情况下复制它很聪明:

[self performSelector:@selector(executeBlockAfterDelay:) withObject:block afterDelay:delay];

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读