即将开始开发iPhone应用程序,我想知道在开发iphone时使用自动释放有多糟糕。我遇到了一些相当随机的崩溃,到目前为止,除了内存使用不当之外,我无法指出它。

作为一名Cocoa新手我记得最初阅读的指南文件强烈建议避免自动释放,转而支持手动保留/发布iPhone。然而,一个更“高级”的Cocoa开发人员很早就加入进来(具有讽刺意味的是,自那以后一直放手),他们在整个地方都使用了自动释放。不可否认,我进入了“猴子见猴子”。模式,它似乎又回来困扰我(我现在是项目中唯一的开发人员)。

接下来要做什么?在我看来,我必须分支代码并尝试通过并在可能的情况下替换自动释放代码保持我的手指交叉,我不会无意中破坏应用程序。似乎很多库调用都会导致自动释放的对象,比如stringWithFormat,以及我自己不使用alloc的任何东西。我应该注意的任何其他的getchyas和/或建议?谢谢可可大师。

有帮助吗?

解决方案

使用release而不是autorelease可以改善紧张位置的内存使用率(这在iPhone上很好),但是如果你没有遵循保留/释放规则,它就不会对崩溃有所帮助。我会在Obj-C中阅读一些关于内存管理的教程,如果你对你应该做的事情仍然有点朦胧,然后使用调试器和崩溃报告来查找那些崩溃,找出你在释放对象的位置。 这个是两个很好的起点。

其他提示

比自动释放或手动释放选择更重要的是 alloc dealloc NSAutoreleasePool 的频率。由于大多数Cocoa框架都使用 autorelease ,因此您需要有适当的池排放策略。一旦到位,选择是否 release autorelease 就不那么重要了。

话虽这么说,你应该担心的唯一领域是紧密循环 - 每隔几次迭代分配和发布 NSAutoreleasePool 以获得最佳结果;当你产生另一个没有Runloop的 NSThread 时 - 创建一个池并将其耗尽,所以经常变得空闲。由于大多数应用程序每个事件只分配少量数据, UIKit 的策略是在调度事件之前分配池,并在调度返回后释放它非常有效。

如果您认为自己不知道如何使用自动释放,请在iTunes U上查看CS193p FALL 2010 - >第4讲。

它教你所有关于内存管理和内容(如果你跳过前10分钟左右)

出于iPhone性能原因,Apple建议尽可能不使用自动释放的对象。相反,当你完成它们时,明确地释放你的对象。

使用自动释放池意味着您可能会留下一些未使用的内存。由于iPhone的内存较少,如果你尽快释放不需要的内存,而不是让它在等待自动释放时占用资源,你可能会提高性能。

当你自动发布时,你基本上是在说:“我不再需要这个了,但是其他任何人都可以自由选择它(在自动释放池耗尽之前)”。当您明确地重新发送您所说的对象时:“我不再需要这个,除非其他人已经另有说明(已获得),否则应立即取消分配。”

因此,自动释放通常不是错误的。当您想要将对象传递回邮件的发件人而不要求发件人负责释放对象时,它是必需的。

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