18

我正在尝试了解使用 xamarin.ios 并在实际 iOS 设备上运行应用程序时内存管理的工作原理。我的理解是iOS平台没有垃圾收集器,但是平台使用了ARC(Automatci Reference Counting)。

编译后的应用程序将使用 ARC 而不是垃圾收集,这是真的吗?

4

2 回答 2

33

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。

于 2013-08-05T14:01:47.983 回答
7

Xamarin docs Here中有一个很好的总结

于 2013-08-05T11:36:14.167 回答