我正在尝试了解使用 xamarin.ios 并在实际 iOS 设备上运行应用程序时内存管理的工作原理。我的理解是iOS平台没有垃圾收集器,但是平台使用了ARC(Automatci Reference Counting)。
编译后的应用程序将使用 ARC 而不是垃圾收集,这是真的吗?
我正在尝试了解使用 xamarin.ios 并在实际 iOS 设备上运行应用程序时内存管理的工作原理。我的理解是iOS平台没有垃圾收集器,但是平台使用了ARC(Automatci Reference Counting)。
编译后的应用程序将使用 ARC 而不是垃圾收集,这是真的吗?
ARC 是一种适用于由 Objective-C 编译器编译的源代码的技术,它具有将每个赋值转换为这样的效果:
foo = bar
其中“foo”和“bar”是 NSObjects 到以下代码中:
if (foo != null)
[foo release];
if (bar != null)
[bar retain]
foo = bar;
如您所见,它只是一个编译器技巧,可以重写您的代码,因此您不会忘记保留/释放内容,并且仅适用于 Objective-C。
Objective-C 库使用什么(ARC 或无 ARC)对 MonoTouch 来说并不重要,只要它们使用现有的文档协议来确定何时保留和何时释放。MonoTouch 只是遵循这些规则。
C# 对象没有保留/释放代码路径,而只是使用 GC 来确定哪些对象是活动的。
当 Objective-C 对象出现在 C# 世界中时,Monotouch 会获取一个引用(它调用了 retain)。当 MonoTouch GC 确定任何托管代码都无法再访问某个对象时,GC 会在该对象上调用 release。
Xamarin docs Here中有一个很好的总结