【问题标题】:Differences between Objective-C 2.0 vs. CLR in regards to memory managmenetObjective-C 2.0 与 CLR 在内存管理方面的差异
【发布时间】:2009-05-01 22:48:06
【问题描述】:

我一直在学习在 cocoa touch 平台上开发应用程序。我已经走了很长一段路,但我无法理解的是内存管理。

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

Objective-C 2.0 和 CLR 在内存管理方面的关键/重要区别是什么?关于 Objective-C 2.0,我正在 iPhone OS 上开发,不鼓励使用自动发布功能。

我想我正在寻找两者的比较...由于我来自 .NET 背景,我可能需要了解有关 Objective-C 2.0 内存管理的哪些内容?

谢谢大家!

【问题讨论】:

    标签: iphone cocoa-touch memory-management clr


    【解决方案1】:

    CLR 在虚拟机中运行;所有对象的释放都由垃圾收集系统处理。通常,在 Objective-C 中,内存必须通过旧的 C 风格 malloc/free 或通过保留/释放的引用计数系统手动管理。如果您来自标准的“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 才刚刚开始整合。

    【讨论】:

      【解决方案2】:

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

      在 .NET CLR 中,大部分情况下,您并不关心内存是怎样的或对象如何处理它。

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

      我需要习惯的一件事是您可以拥有一个自动执行保留的属性,因此如果您创建一个对象然后将其分配给该属性,它的计数将为 2。更好的方法是创建将对象分配给属性的临时变量,然后释放临时变量以将计数减为 1。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-08
        • 1970-01-01
        相关资源
        最近更新 更多