C# Xamarin iOS的编译结果是什么?

C# Xamarin iOS的编译结果是什么?,c#,ios,xamarin,memory-management,xamarin.ios,C#,Ios,Xamarin,Memory Management,Xamarin.ios,我知道有人问过我这个问题,但我想要的答案从来没有被提及过 我知道Xamarin会编译成IL,然后转换成本机二进制文件,但我有一个更具体的问题,那就是如何管理内存 我的问题与本机二进制文件中的内存管理有关,在将C#编译到Android时,您在.NET和本机Java中都有系统资源的对象句柄,在某些情况下(如位图),您需要同时清理这两个对象(清理对象的.NET句柄,以及Java中的本机对象本身),这是因为Java和C都是垃圾收集语言。就斯威夫特而言,垃圾收集并不是经常发生的事情,它只是引用计数,所以内

我知道有人问过我这个问题,但我想要的答案从来没有被提及过

我知道Xamarin会编译成IL,然后转换成本机二进制文件,但我有一个更具体的问题,那就是如何管理内存

我的问题与本机二进制文件中的内存管理有关,在将C#编译到Android时,您在.NET和本机Java中都有系统资源的对象句柄,在某些情况下(如位图),您需要同时清理这两个对象(清理对象的.NET句柄,以及Java中的本机对象本身),这是因为Java和C都是垃圾收集语言。就斯威夫特而言,垃圾收集并不是经常发生的事情,它只是引用计数,所以内存管理就不那么重要了,更重要的是,我的同事(他为我们的Xamarin应用程序构建了iOS端)从来没有内存问题,而我在Android应用程序中有很多内存问题

由此我得出结论,在某种程度上,Xamarin Android和Xamarin iOS的内存处理方式必须有所不同,但我不确定,因为我不知道iOS应用程序是如何编译的,回答这个问题的是知道Xamarin iOS编译成什么语言,所以我的问题是,Xamarin iOS是否编译成Objective-C,斯威夫特,还是别的什么?我想对正在发生的事情有一个更好的了解,这样我就知道如何在iOS应用程序中处理内存

话虽如此,我们的iOS应用程序完全有可能没有内存泄漏,因为我的同事在编写时比我更清楚,我可能只是不称职,得出错误的结论,如果是这样,请随时告诉我


如果我把这个问题说得很奇怪,请告诉我,我会尝试澄清我的意思。

自从我很久以前读过这个问题以来,这可能已经改变了,但由于苹果最初不允许在iOS上使用虚拟机,Xamarin for iOS AOT将IL直接编译为本机代码。在我看来,它不太可能添加一种类似C语言的语言作为中间步骤。可能只是使用了VM的JIT代码的修改版本直接从IL转换为本机二进制。我认为垃圾收集器的本机代码是内置在二进制文件中的。这与我读到的内容类似,所以看起来是这样的……那么垃圾收集是在运行时发生的,还是在iOS中进行引用计数?据我所知,垃圾收集发生在运行时。我应该补充一点,引用计数是由Objective-C或Swift运行时提供的服务,
NSObject
s是引用计数的。因此,虽然在C#代码中创建的.NET对象将被垃圾收集,但有些对象将包装引用计数的
NSObject
s。您应该能够信任Xamarin人员,以确保所有由Xamarin类包装的
NSObject
s都将得到正确管理,但需要注意的是,您可能应该显式地
Dispose()
.NET对象,当您处理完它们时,它们会包装
NSObject
s,因此它们会立即被处置,而不是在GC到达它们时。这很好地回答了我的问题,我想,谢谢!