MonoTouch如何收集垃圾?

时间:2011-04-21 10:14:22

标签: xamarin.ios

是否在任何地方发布了MonoTouch垃圾收集的详细信息?我很想知道它在iPhone上是如何工作的。我想知道:

  • 它运行的频率,是否存在可能阻止其运行的任何约束。
  • 它是否完全是线程安全的,因此正确处理从一个线程传递到另一个线程的对象,如果存在我们应该注意的约束。
  • 如果在启动将使用内存的操作之前手动调用垃圾收集器有任何好处。
  • 它如何处理内存不足通知和内存不足。

    此类信息有助于我们了解应用程序日志中的堆栈和线程信息。

    [编辑]我现在在Hans Boehm's站点找到了这些信息,但这是非常通用的,列出了实现者的各种选项和选择,包括如何处理线程。具体的MonoTouch信息是我想要的。

  • 1 个答案:

    答案 0 :(得分:7)

    垃圾收集器与Mono中使用的垃圾收集器相同,源代码在这里:

    https://github.com/mono/mono/tree/master/libgc

    它是完全线程安全的,并且是多核安全的,这意味着多个线程可以分配对象,并且它可以在存在多个线程的情况下进行垃圾收集。

    话虽这么说,你的问题有点棘手,因为当你说“所以从一个线程传递到另一个线程的对象是处理属性时,你是不是真的在询问垃圾收集器,如果有一个限制应该是意识到“。

    这不是垃圾收集器问题,而是API问题。这在很大程度上取决于您所调用的API。规则与.NET相同:实例方法永远不是线程安全的,静态方法默认是线程安全的。除非在API中明确说明它们不是。

    现在使用UIKit或CoreGraphics等UI API,它们与世界上任何其他GUI工具包都没有什么不同。 UI工具包不是线程安全的,因此您不能假设可以安全地从线程访问在主线程上创建的UILabel。这就是为什么你必须在NSObject上调用“BeginInvokeOnMainThread”以确保你在UIKit对象上调用的任何方法都只执行主线程。

    这只是一个例子。

    检查http://monotouch.net/Documentation/Threading以获取更多信息

    低内存通知由操作系统提供给您的UIViewControllers,而不是Mono的GC,因此您需要在这些情况下采取适当的措施。