0

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

 dispatch_async(dispatch_get_main_queue(), ^{
        self.emptyView.hidden = [self.recordsData count];
        [self finishedRefreshing];
    });

这使我相信,由于我们正在访问 ivar,因此将创建一个保留周期。但是由于我没有看到在 self 中捕获的块,所以我想我会没事的。这让我相信我们已经结束了使用weakself模式,因为我们的典型约定是永远不会将块实际分配为ivar。我仍然觉得我错过了一些东西,有没有其他方法可以创建保留循环而不将块分配给自我?我不知道为什么我很难掌握这个概念,但任何好的阅读资源也会受到赞赏。

4

1 回答 1

6

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

我们已经用完了weakself模式

似乎很多人认为“啊!块!做一个weakSelf”!

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

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

于 2013-10-29T07:22:21.123 回答