【发布时间】:2012-10-25 19:34:55
【问题描述】:
我想我已经接近理解how Mono GC and ObjC ref counting live together。
它的工作方式是,当本机对象的引用计数为 1 时,我们不会阻止托管实例进行垃圾收集。 一旦引用计数增加到 1 以上,我们就会阻止托管实例被垃圾回收。
这是因为托管对象可能包含用户状态。对于镜像对应本机对象的托管对象(例如托管 UIView 实例),MonoTouch 知道该实例不能包含任何状态,因此只要没有托管代码引用托管实例,GC 就可以收集它。如果稍后需要托管实例,我们只需创建一个新实例。
所以如果我创建一个继承UIButton 的CustomButton,将其作为子视图添加到我的View,让托管引用滑出范围然后运行GC,这个托管 @ 987654325@仍不符合领取条件。
为什么不能收藏?当然,它可能具有类似属性的托管状态,但是如果托管对象没有链接到它,那么谁在乎这个状态?还不如直接消失,为什么不能呢?
我在想一个可能的原因:订阅CustomButton 事件不会让 GC 保持活动状态,因此当对象被收集时,事件会停止触发。这可能会导致意外行为。
这是正确的吗?即使没有人链接它,是否还有其他原因可以使托管对象保持活动状态?
【问题讨论】:
标签: xamarin.ios garbage-collection