【发布时间】:2014-12-02 23:03:26
【问题描述】:
我正在尝试使用 Objective-C 中的块来实现或多或少直接的回调机制。然而,我担心的是这将如何与 ARC 和内存管理一起工作。
考虑这样一种场景,我有一个视图控制器,它显示来自模型对象的一些相关信息,该模型对象支持我的块回调机制,只要该对象上的字段发生更改就会触发该机制(假设我不想为此使用 KVO )。视图控制器注册了一个引用 self 的块,并在该块内更新 UI 的各个方面。
现在假设视图消失了,但模型仍然存在于内存中,因为它可能在其他地方被引用。当对象更改并调用其注册的回调块时,现在会发生什么?大概这些块本身会持续存在,但是当我尝试引用 self 时,我会得到零。 (?)
我想要发生的事情是仅在其“目标”(本例中的视图控制器)仍然存在时才实际调用回调块。
第一个问题是,当视图控制器被释放时,有没有办法让块本身被自动释放?例如,如果我保留对块本身的弱引用会发生什么?我猜这是行不通的,因为这些块会立即消失,没有其他东西引用它们。
我的第二个想法是在块本身旁边保留对目标的弱引用,这样我可以在调用块之前检查目标引用以查看它是否活着(如果我发现目标已死我可以简单地删除相应的块)。
然后我的问题是我应该使用什么数据结构来存储这些——也许是一个结构或类,它维护对目标的弱引用和对块的强引用?
【问题讨论】:
标签: objective-c automatic-ref-counting objective-c-blocks weak-references