如果垃圾收集器在Monotouch 4中"更具攻击性",这意味着什么?

Kru*_*lur 2 .net mono garbage-collection xamarin.ios boehm-gc

我偶然发现了这个问题:ContentView中的按钮导致MonoTouch运行时崩溃.Monotouch 4.0中的错误?而询问者对Monotouch的"更具侵略性"的垃圾收集器存在问题.

  • 有人可以解释为什么在询问者的情况下会发出错误(收集什么以及为什么?)?
  • "更具攻击性"是什么意思?我可以陷入什么陷阱?我应该避免什么?
  • 关于iOS5:苹果声称iOS5应用程序将获得一个内存警告,然后它将被杀死.与之前的任何其他版本不同,应用程序收到三个警告.这对Monotouch意味着什么?它将如何处理这种行为?

也许其中一个Xamarin团队可以总结一些注意事项并给出一个很好的解释?

我目前正在从MT 3.2.6升级到MT 4.1,并希望查看我的代码并检查需要更改的内容.

mig*_*aza 6

我们发现,有时开发人员会遇到奇怪的问题,比如对话框有时会留在屏幕上,有时它们会消失而不会留下痕迹,也没有解释为什么会发生这种情况.

这通常发生在您创建UIAlertView并且没有引用它时,因此就MonoTouch而言,该对象是垃圾(您没有从代码中引用它,因此您没有使用它).

但是,对话框是否立即或稍后从屏幕上消失,取决于垃圾收集器的启发式方法是否确定是时候运行集合了.如果您刚刚在收集后创建了一个对话框,则可能是您的对话框将保留在屏幕上.但是如果你非常接近某个集合,或者你有一个后台进程消耗内存,那么就会触发GC.

这通常让用户感到困惑,"为什么事情会随机消失".答案是:如果你没有提到它,GC认为你不在乎.

为了让我们的用户更清楚,在模拟器上以调试模式运行MonoTouch时(并且有一个命令行选项可以控制任何版本),我们在模拟器上添加了一个连续调用GC.Collect()的线程几秒钟.这使得您可能没有保留对您的对话框的引用更加明显.

后来,我们发现一个非常有用和常见的模式是保持两种对话框,除了它们的副作用之外没有任何用处:UIAlertView和UIActionSheet.我们改变了MonoTouch,以便它在内部保留对这两者的引用,直到被解雇.

因此,我们最终得到了两个方面的优点:在开发周期中,您可以捕获早期缺少对所需对象的引用,并且我们处理了两个最常见的仅对其副作用有用的情况.