
如果我有一个区块,我会这样做:
__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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)