2

在开发 iPhone 应用程序即将结束时,我想知道在为 iphone 开发时使用 autorelease 有多糟糕。我面临着一些相当随机的崩溃,到目前为止,除了马虎的内存使用之外,我无法确定它是什么。

作为一个 Cocoa 新手,我记得最初阅读了一份指南文档,该文档强烈建议避免自动释放以支持 iPhone 的手动保留/释放。然而,一个更“高级”的 Cocoa 开发人员很早就加入了(具有讽刺意味的是,自那以后他就被解雇了),他在所有地方都使用了 autorelease。诚然,我进入了“猴子看猴子做”模式,它似乎又回来困扰着我(我现在是该项目的唯一开发人员)。

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

4

6 回答 6

12

使用 release 而不是 autorelease 可以提高内存使用率(这在 iPhone 上很好),但如果您不遵循保留/释放规则,它对崩溃毫无帮助。如果你对你应该做什么仍然有点模糊,我会阅读一些关于 Obj-C 内存管理的教程,然后使用调试器和崩溃报告来追踪这些崩溃,找出你在哪里过度释放对象. 是两个很好的起点。

于 2009-01-09T20:14:54.380 回答
4

比自动发布或手动发布选择更重要的是您allocdeallocNSAutoreleasePool的 s. 由于大多数 Cocoa 框架都autorelease自由使用,因此您需要有一个适当的池耗尽策略。一旦做到这一点,是否选择releaseautorelease成为问题就变得不那么重要了。

话虽如此,您应该担心的唯一领域是紧密循环——NSAutoreleasePool每隔几次迭代分配和释放一次以获得最佳结果;并且当您生成另一个NSThread没有 Runloop 的池时,创建一个池并每隔一段时间将其排空就会变得空闲。由于大多数应用程序只为每个事件分配少量数据,UIKit因此在调度事件之前分配池并在调度返回后释放它的策略非常有效。

于 2009-01-10T10:39:12.607 回答
2

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

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

于 2010-11-20T05:10:26.367 回答
0

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

于 2009-01-09T20:47:51.893 回答
0

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

于 2010-01-27T03:24:33.797 回答
0

当您自动释放时,您基本上是在说:“我不再需要它,但其他人可以自由地拿起它(在自动释放池耗尽之前)”。当您明确释放一个对象时,您是在说:“我不再需要它,除非其他人已经说过(获得),否则应该立即释放它。”

因此,自动释放通常不是错误的事情。当您想将对象传递回消息的发送者而不要求发送者负责释放对象时,它是必需的。

于 2012-11-08T07:28:49.073 回答