我已经阅读了 benzado 写的一篇很棒的文章,如果我们有一个类变量保留块本身,并且块保留“自我”,那么使用块将导致内存泄漏,这会导致保留周期。
但我不明白为什么使用 GCD 会导致同样的问题?像 dispatch_async() 这样的函数对我来说看起来像是一个不应该被类本身捕获的局部变量?
并且官方文档说我们应该在blocks中加入autorelease,以保证我们的objects被及时释放。
在我的大部分 IOS 项目中,我都像这样使用 GCD:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,(unsigned long)NULL), ^(void) {
NSDictionary *resultDic = [MyService loadData];
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate useData:resultDic];
});
});
现在我需要将它们全部更改为
__block MyClass *blockSelf = self;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,(unsigned long)NULL), ^(void) {
@autoreleasepool{
NSDictionary *resultDic = [MyService loadData];
dispatch_async(dispatch_get_main_queue(), ^{
@autoreleasepool{
[blockSelf.delegate useData:resultDic];
}
});
}
});
??
它看起来很脏。有谁知道如何以正确的方式做到这一点?
顺便说一句,如果我在块中调用了一些函数并在该函数中使用“self”或“self.delegate”,这是否意味着我需要将所有这些更改为其他内容?(我不知道该怎么做才能解决它)
仅供参考,我的 IOS 项目是在 IOS8.1 和非 ARC环境中构建的。