Xamarin.ios 为什么可以';t MonoTouch GC使用refcount杀死托管对象>;1.

Xamarin.ios 为什么可以';t MonoTouch GC使用refcount杀死托管对象>;1.,xamarin.ios,garbage-collection,Xamarin.ios,Garbage Collection,我想我正在接近理解 其工作方式是,当本机对象的引用计数为1时,我们不会阻止托管实例进行垃圾收集一旦引用计数增加到1以上,我们就会阻止托管实例被垃圾回收。 这是因为托管对象可能包含用户状态。对于镜像相应本机对象(如托管UIView实例)的托管对象,MonoTouch知道该实例不能包含任何状态,因此只要没有托管代码引用托管实例,GC就可以收集它。如果后期需要托管实例,我们只需创建一个新实例 因此,如果我创建一个继承UIButton的CustomButton,将其作为子视图添加到我的视图,让托管引用滑

我想我正在接近理解

其工作方式是,当本机对象的引用计数为1时,我们不会阻止托管实例进行垃圾收集一旦引用计数增加到1以上,我们就会阻止托管实例被垃圾回收。

这是因为托管对象可能包含用户状态。对于镜像相应本机对象(如托管UIView实例)的托管对象,MonoTouch知道该实例不能包含任何状态,因此只要没有托管代码引用托管实例,GC就可以收集它。如果后期需要托管实例,我们只需创建一个新实例

因此,如果我创建一个继承
UIButton
CustomButton
,将其作为子视图添加到我的
视图
,让托管引用滑出范围,然后运行GC,这个托管仍然不符合收集条件

为什么不能收集呢?当然,它可能有类似于托管状态的属性,但是如果托管对象没有指向它的链接,谁会关心这个状态呢?它也可能消失,为什么不能呢

我在想一个可能的原因:订阅
CustomButton
事件不会使GC保持活动状态,因此当对象被收集时,事件停止触发。这可能会导致意外的行为

这是正确的吗?即使没有人链接托管对象,也有其他原因使其保持活动状态吗

为什么不能收集呢?当然,它可能具有类似于托管状态的属性,但如果托管对象没有指向它的链接,谁会关心这个状态呢?它也可能消失,为什么不能呢

本机代码可能有对该对象的引用,这可能会导致该对象在以后重新出现为托管代码

我相信一个代码示例可以说明会发生什么:

类MyView:UIView{
公共字符串重要密码;
}
类AppDelegate:UIApplicationDelegate{
UIVIEW控制器vc;
公共覆盖bool FinishedLaunching(UIApplication应用程序,
(字典选项)
{
var myView=newmyview();
myView.ImportantSecret=“MonoTouchRocks”;
vc=新的UIViewController();
View=newuiview();
vc.View.AddSubView(myView);
//当此方法返回引用myView的唯一位置时
//来自*native*子视图集合内部。
BeginInvokeMainThread(()=>
{
Console.WriteLine(((MyView)vc.subview[0]).ImportantSecret);
//如果MyView实例被垃圾收集并重新创建
//此时,ImportancesCret将自动为null。
});
}
}

重要提示:此代码只是为了说明GC无法收集可能具有状态的托管对象的原因。这个特定的示例实际上不会忘记重要的秘密,因为子视图数组会自动缓存在托管代码中-但这通常不是真的。

我终于明白了!你们在这里的支持是不可或缺的。我喜欢你们的两个问题和罗尔夫的伟大答案——刚刚学到了一些新东西:-)我一直在玩这个。如果myView变量是在using块中创建的呢?instruments工具指示实例被释放。这感觉很尴尬,但我无法确定代码行为中的身份和问题。想法@罗尔夫