iOS:块,主队列和保留周期

0 ios objective-c-blocks

我的应用程序中有以下调用:

 dispatch_async(dispatch_get_main_queue(), ^{
        self.emptyView.hidden = [self.recordsData count];
        [self finishedRefreshing];
    });
Run Code Online (Sandbox Code Playgroud)

这使我相信,因为我们正在访问一个ivar,所以会创建一个保留周期.但是因为我没有看到在自我内部捕获的块我觉得我没事.这让我相信我们已经过度使用弱自身模式,因为我们的典型惯例是永远不会将块作为ivar实际分配.我仍然觉得我错过了一些东西,有没有其他方法可以创建一个保留周期而无需将块分配给自己?我不知道为什么我很难掌握这个概念,但任何好的阅读资料也都很受欢迎.

jrt*_*ton 6

当人们担心保留周期时,"周期"部分似乎确实被忽视了.在您的代码中,块由GCD管理,您的对象不拥有它,因此没有保留周期.

我们一直在使用弱自己的模式

似乎很多人都认为"aargh!Blocks!make a weakSelf"!

保留周期发生在块拥有的对象(因此,对对象或其中一个ivars的强引用)本身拥有块时(因此块被复制到属性或ivar).

典型的情况是,您创建了一个对象,例如具有完成处理程序块的自定义警报视图,并且在块中您对对象本身执行某些操作(例如,从其超级视图中删除视图).