ios – 在块中阻塞,__weak self

ios – 在块中阻塞,__weak self,第1张

概述我想知道我是否做得对: 如果我有一个区块,我会这样做: __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(); //invokeself.callback = nil; //release

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

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

以上是内存溢出为你收集整理的ios – 在块中阻塞,__weak self全部内容,希望文章能够帮你解决ios – 在块中阻塞,__weak self所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1014834.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-22
下一篇2022-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存