解雇视图控制器时为什么不保留圆圈(非圆弧)

时间:2014-11-25 08:43:33

标签: ios objective-c

我有非弧的代码,我认为它有问题 - 圈保留( self(UIViewController)拥有完整块的权限,完整块拥有自己的所有权 )。但是当我调试时,它在dealloc中运行(意味着我认为没有圆圈保留计数)

[self dismissViewControllerAnimated:YES completion:^{
    [self goToChatViewController:buddyEntity];
}];

有人可以为我解释一下,为什么它不会在此代码中保留?

2 个答案:

答案 0 :(得分:3)

你不在这个街区举行参考。所以这个块在完成后解除分配。 当块解除分配时,它释放它所持有的对象。 所以没关系。你可以在这些块中勇敢地使用self

例如,如果您将块用作属性或将其添加到容器中,则会出现保留周期。

答案 1 :(得分:0)

一个块秘密地是一个ObjectiveC对象。当你在后台创建一个块时,ObjectiveC会创建一个块类的实例(尽管非常奇怪,它会在堆栈而不是堆上创建它,除非你复制块)。块内使用的对象成为块对象的实例变量。

因为块对象在堆上,而不是在堆栈上,所以当你到达方法的末尾时,你在块对象中的范围超出了范围而且一切都很好。但是,如果您的类在块上调用copy并保留引用,则该块将被复制到堆中。现在你的类有一个块的引用,块有一个对你的类的引用,你有一个保留周期。