自动释放iPhone

时间:2009-01-09 20:09:49

标签: iphone cocoa-touch memory-management autorelease

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

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

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

6 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

当你自动发布时,你基本上会说:&#34;我不再需要这个了,但是其他任何人都可以自由选择它(在自动释放池耗尽之前)&# 34 ;.当您明确地转发一个对象时,您会说:&#34;我不再需要这个,除非其他人已经另有说明(已获得),否则应立即取消分配。&#34; < / p>

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