代码之家  ›  专栏  ›  技术社区  ›  Frank V

客观C 2.0与clr在记忆管理方面的差异

  •  1
  • Frank V  · 技术社区  · 16 年前

    我一直在学习在CocoaTouch平台上开发应用程序。我已经走了很长的路,但有一件事我不能完全理解,那就是记忆管理。

    我想我应该走比较的路线,而不是从头开始。对于clr(.net)和objective-c 2.0之间的区别我找不到太多,所以我想知道堆栈溢出社区是否可以帮助我解决这个问题。

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

    我想我在找两个比较…由于我来自.NET背景,关于Objective-c 2.0内存管理,我需要了解哪些内容?

    谢谢大家!

    2 回复  |  直到 16 年前
        1
  •  1
  •   Mr. Cairo    16 年前

    clr在虚拟机中运行;对象的所有释放都由垃圾收集系统处理。通常,在目标C内存中,必须通过旧的C样式malloc/free或通过保留/释放的参考计数系统手动管理。如果你来自一个标准的“C”背景,这种技术看起来不会太陌生。

    通过引用计数,系统计算使用特定对象的次数——这基本上就是上面提到的“保留”。当使用对象完成某些操作时,对象将手动发送一条“释放”消息,该消息将对象的保留计数减少1。当计数达到0时,系统自动取消分配对象。与clr/.net相比,这看起来非常麻烦,但是这种机制提供了更好的性能和更多的控制。

    如果您在Macintosh上使用Objective-c 2.0编码,那么您很幸运,因为可以通过Xcode中的选项启用垃圾收集。这将更接近于clr所提供的。如果你是在iPhone上开发,垃圾收集在内存和CPU方面花费太多,所以它不是一个选项。必须手动管理内存。

    幸运的是,在发送消息和“自动释放”消息到对象之间有一个中间选项。这个机制包含在Macintosh和iPhone中,基本上是将分配的对象集中到一个全局字典中(它实际上称为自动释放池)。当应用程序存在或池被排出时,对象将被取消分配。然而,并不是所有的东西都进入自动释放池,也不想把所有的东西都放在那里。我建议你阅读一下苹果网站上关于Objective-c 2.0编程语言的枯燥而重要的阅读资料,了解更多细节。

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

    祝你好运,有耐心。Objective-C并不像.NET那样是一个刚起步的孩子(已经超过25岁了),但它有一些令人难以置信的功能,而.NET现在才刚刚开始整合。

        2
  •  1
  •   Darryl Braaten    16 年前

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

    在.NET CLR中,您不关心内存是如何的,也不关心对象在很大程度上如何处理它。

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

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