Kru*_*lur 2 .net mono garbage-collection xamarin.ios boehm-gc
我偶然发现了这个问题:ContentView中的按钮导致MonoTouch运行时崩溃.Monotouch 4.0中的错误?而询问者对Monotouch的"更具侵略性"的垃圾收集器存在问题.
也许其中一个Xamarin团队可以总结一些注意事项并给出一个很好的解释?
我目前正在从MT 3.2.6升级到MT 4.1,并希望查看我的代码并检查需要更改的内容.
我们发现,有时开发人员会遇到奇怪的问题,比如对话框有时会留在屏幕上,有时它们会消失而不会留下痕迹,也没有解释为什么会发生这种情况.
这通常发生在您创建UIAlertView并且没有引用它时,因此就MonoTouch而言,该对象是垃圾(您没有从代码中引用它,因此您没有使用它).
但是,对话框是否立即或稍后从屏幕上消失,取决于垃圾收集器的启发式方法是否确定是时候运行集合了.如果您刚刚在收集后创建了一个对话框,则可能是您的对话框将保留在屏幕上.但是如果你非常接近某个集合,或者你有一个后台进程消耗内存,那么就会触发GC.
这通常让用户感到困惑,"为什么事情会随机消失".答案是:如果你没有提到它,GC认为你不在乎.
为了让我们的用户更清楚,在模拟器上以调试模式运行MonoTouch时(并且有一个命令行选项可以控制任何版本),我们在模拟器上添加了一个连续调用GC.Collect()的线程几秒钟.这使得您可能没有保留对您的对话框的引用更加明显.
后来,我们发现一个非常有用和常见的模式是保持两种对话框,除了它们的副作用之外没有任何用处:UIAlertView和UIActionSheet.我们改变了MonoTouch,以便它在内部保留对这两者的引用,直到被解雇.
因此,我们最终得到了两个方面的优点:在开发周期中,您可以捕获早期缺少对所需对象的引用,并且我们处理了两个最常见的仅对其副作用有用的情况.