我有非弧的代码,我认为它有问题 - 圈保留( self(UIViewController)拥有完整块的权限,完整块拥有自己的所有权 )。但是当我调试时,它在dealloc中运行(意味着我认为没有圆圈保留计数)
[self dismissViewControllerAnimated:YES completion:^{
[self goToChatViewController:buddyEntity];
}];
有人可以为我解释一下,为什么它不会在此代码中保留?
答案 0 :(得分:3)
你不在这个街区举行参考。所以这个块在完成后解除分配。
当块解除分配时,它释放它所持有的对象。
所以没关系。你可以在这些块中勇敢地使用self
。
例如,如果您将块用作属性或将其添加到容器中,则会出现保留周期。
答案 1 :(得分:0)
一个块秘密地是一个ObjectiveC对象。当你在后台创建一个块时,ObjectiveC会创建一个块类的实例(尽管非常奇怪,它会在堆栈而不是堆上创建它,除非你复制块)。块内使用的对象成为块对象的实例变量。
因为块对象在堆上,而不是在堆栈上,所以当你到达方法的末尾时,你在块对象中的范围超出了范围而且一切都很好。但是,如果您的类在块上调用copy并保留引用,则该块将被复制到堆中。现在你的类有一个块的引用,块有一个对你的类的引用,你有一个保留周期。