我的应用程序中有以下呼叫:
dispatch_async(dispatch_get_main_queue(), ^{
self.emptyView.hidden = [self.recordsData count];
[self finishedRefreshing];
});
让我相信,由于我们正在访问一个ivar,因此会创建一个保留周期。但是因为我没有看到在自我内部捕获的块我觉得我没事。这让我相信我们已经过度使用弱自身模式,因为我们的典型惯例是永远不会将块作为ivar实际分配。我仍然觉得我错过了一些东西,有没有其他方法可以创建一个保留周期而无需将块分配给自己?我不知道为什么我很难掌握这个概念,但也很欣赏任何好的阅读资料。
答案 0 :(得分:6)
当人们担心保留周期时,“周期”部分似乎确实被忽略了。在您的代码中,块由GCD管理,您的对象不拥有它,因此没有保留周期。
我们一直在使用弱自我模式
似乎很多人都认为“aargh!阻止!制作weakSelf
”!
当块拥有的对象(因此,对对象或其中一个ivars的强引用)本身拥有块时(因此块被复制到属性或ivar),会发生保留周期。
典型的情况是,您创建了一个对象,例如具有完成处理程序块的自定义警报视图,并且在块中您可以对该对象本身执行某些操作(例如,从其超级视图中删除该视图)。