我一直在学习在可可触摸平台上开发应用程序。我走了很长的路,但是我无法解决的一件事就是内存管理。

我以为我会采取一种比较的方式,而不是试图从头开始。我无法找到CLR(.net)和Objective-C 2.0之间的差异,所以我想知道堆栈溢出社区是否可以帮助我解决这个问题。

Objective-C 2.0和CLR之间在内存管理方面的关键/重要差异是什么?关于Objective-C 2.0,我正在开发iPhone OS并且不鼓励自动释放功能。

我想我正在寻找两者的比较...因为我来自.NET背景,我需要了解的关于Objective-C 2.0内存管理的事情是什么?

谢谢大家!

有帮助吗?

解决方案

CLR在虚拟机中运行;所有对象的解除分配都由垃圾收集系统处理。通常在Objective-C内存中必须通过旧C样式malloc / free或通过retain / release的引用计数系统手动管理。如果你来自标准的“C”,背景,这项技术似乎不会太陌生。

通过引用计数,系统计算特定对象的使用次数 - 这基本上是“保留”状态。上文提到的。当使用对象完成某事时,该对象手动发送“释放”对象。将对象的保留计数减1的消息。当计数达到0时,系统自动释放对象。与CLR / .NET相比,这看起来非常麻烦,但该机制提供了更好的性能和更多的控制。

如果您在Macintosh上使用Objective-C 2.0编码,那么您很幸运,因为可以通过XCode中的选项启用垃圾收集。这将更接近CLR提供的内容。如果你在iPhone上进行开发,垃圾收集在内存和CPU方面的成本太高,所以它不是一个选择。必须手动管理内存。

幸运的是,有一个中间选项,通常用于发送和“自动释放”。消息到对象。这种机制包括在Macintosh和iPhone中,基本上将分配的对象集中到一个全局字典中(实际上称为自动释放池)。当应用程序存在或池耗尽时,然后取消分配对象。但是,并非所有内容都进入自动释放池,您也不想将所有内容都放在那里。我建议从Apple网站上阅读干燥但重要的Objective-C 2.0编程语言,并详细介绍。

http://developer.apple.com/documentation /Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html

祝你好运并有耐心。 Objective-C并不是像.Net这样的新手(它已经超过25年了),但它有一些令人难以置信的功能,.Net刚刚开始合并。

其他提示

在iPhone上它是手动的。如果您分配或保留内存,则必须将其释放。

在.NET CLR中,大多数情况下,你不关心内存是什么或者用什么对象。

对于iPhone,您需要平衡每个对象分配,初始化或保留释放。由于iPhone使用简单的引用计数机制,一旦计数降至0,对象将被清理。

我需要习惯的一件事是你可以拥有一个自动执行保留的属性,所以如果你创建一个对象,然后将它分配给它将具有计数为2的属性。更好的是创建一个对象分配给属性的临时变量,然后释放临时变量以使计数减少到1.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top