![]() |
1
1
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编程语言的枯燥而重要的阅读资料,了解更多细节。 祝你好运,有耐心。Objective-C并不像.NET那样是一个刚起步的孩子(已经超过25岁了),但它有一些令人难以置信的功能,而.NET现在才刚刚开始整合。 |
![]() |
2
1
在iPhone上,它是手动的。如果您分配或保留内存,则必须释放它。 在.NET CLR中,您不关心内存是如何的,也不关心对象在很大程度上如何处理它。 对于iPhone,你需要平衡每一个对象分配,初始化或保留一个版本。由于iPhone使用了一个简单的引用计数机制,一旦计数降至0,对象就会被清除。 我需要习惯的一件事是你可以有一个自动保留的属性,所以如果你创建一个对象,然后将它分配给属性,它将有2个计数。更好的方法是创建一个临时变量的对象,并将其赋给属性,然后释放临时变量,使计数减为1。 |
![]() |
user2606782 · 限制子视图在superview边界内的移动 7 年前 |