我有这个非弧形代码,我认为它有一个问题-循环保留(self (UIViewController)拥有完全块的所有权,完全块拥有self的所有权)。但是当我调试时,它在dealloc中运行(意味着没有我想的循环保留计数)。
[self dismissViewControllerAnimated:YES completion:^{
[self goToChatViewController:buddyEntity];
}];有人能为我解释一下,为什么它不在这个代码中循环保留?
发布于 2014-11-25 09:39:03
在这个街区你不能持有推荐信。所以这个块在完成后就被释放了。当块释放时,释放它所持有的对象。所以一切都没问题。您可以在这样的块中勇敢地使用self。
例如,如果将块用作属性或将其添加到容器中,则会出现保留周期。
发布于 2014-11-25 09:25:17
块秘密地是一个ObjectiveC对象。当您在后台创建一个块时,objectiveC会创建一个块类的实例(尽管很奇怪,它是在堆栈而不是堆上创建的,除非您复制了该块)。块内部使用的对象成为块对象的实例变量。
因为块对象在堆上,而不是在堆栈上--通常情况下,当您到达方法的末尾时,您所在的块对象就超出了作用域,而且一切都很好。但是,如果您的类在块上调用copy并保留一个引用,则该块将被复制到堆中。现在,您的类有一个对块的引用,而这个块有一个对您的类的引用,并且您有一个保留循环。
https://stackoverflow.com/questions/27122084
复制相似问题