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