有什么能让iPhone / iPod Touch应用程序编程更容易进行内存管理吗?

时间:2009-06-22 18:32:07

标签: iphone objective-c memory-management

我只使用Java和Ruby很长时间以至于我真的不喜欢再次跟踪自己的记忆。这不是我不能做到的,我可以。我只是不想。

任何特殊的技巧,库,或者你在iApps中处理内存所学到的任何其他东西,都在我这里。

8 个答案:

答案 0 :(得分:5)

这真的非常非常容易。不要担心保留计数,并且为了善良,永远不要在对象上调用“retainCount”方法。这没用。

如果您在名称中的任何位置调用“alloc”,“new”或“copy”方法,或者调用“retain”方法,则您拥有该对象。当你完成所有权后,你有责任放弃这种所有权。

要做到这一点,如果您仍然需要返回对象的引用,请调用“release”,如果您需要,则调用“autorelease”。

documentation on the subject毫不含糊。这并不难。

答案 1 :(得分:3)

我强烈建议Beginning iPhone Development: Exploring the iPhone SDK

另一个需要关注的重点是获得Clang Static Analyzer设置。它分析您的代码,可以捕获许多常见的内存泄漏以及潜在的逻辑问题。 Apple已大量为此分析仪做出贡献,并希望将其集成到X-Code的未来版本中;)

答案 2 :(得分:2)

这是一种痛苦。我要说的是,在你编写每一段重要的代码后,最重要的习惯是运行内存工具,至少在你了解事情是如何工作的之前。

确保在设备上运行它,而不是模拟器。两者处理一些内存情况的方式不同。

此外,如果您在系统缓存资产时发现内存使用率上升,请不要感到惊讶。如果我没记错的话,我花了很多时间试图弄清楚为什么位图不会消失。我不再使用它了,但操作系统认为在内存不足之前缓存它可能是一个好主意。

这是关于iPhone内存管理方式的great blog post。那里有一些好主意。

答案 3 :(得分:2)

这并不是那么困难。这里有一些经验丰富的经验法则。

  • 释放中的所有属性 dealloc(除非它们设置为“assign”)。
  • 如果你“分配”“新”或 在你的初始化中“复制”,你 可能需要在“释放”中 dealloc的。
  • 如果你“分配”“新”或 在方法的开头“复制”, 你可能需要在“释放” 方法结束。
  • 如果你“分配” “新”或“复制”的东西 一个数组,集合或字典,去吧 提前发布它...... 收藏将保留它没有任何 你的帮助。 (我不是一个忠实的粉丝 autorelease,但这很漂亮 它的使用体面。创建 对象自动释放,然后添加它 到集合。完成的。)

这些都是非常粗略的经验法则,我确信每个人都可以提出这些规则的例外情况,但这些规则对于让你以正确的方式分配和释放内存大有帮助。

在剩下的时间里,经常使用Leaks仪器运行代码。解决问题,因为你找到了它们。现在修复它比在一个月内修复它要容易得多,因为你不记得为什么你这样编写代码。

最后......这种情况很少见,但Apple代码有时会泄漏。 Leaks仪器应该准确地告诉您泄漏的是什么。如果它看起来不像你正在做的事情,它可能不是。作为一个具体的例子:iPhone的核心数据泄漏少量的RAM(我认为)创建一个新的ManagedObjectContext。不过,当你进行取物时,我可能不记得了。

答案 4 :(得分:1)

忘记这一切,不要费心阅读任何人的评论/答案,只需阅读非常简单的Memory Management Rules。为了天堂,它只有十几个句子,你可以在一分钟内阅读。

答案 5 :(得分:0)

我还没有这样做,但我知道Mono已被移植到iPhone上,这意味着你可以用.Net(C#,VB.Net等)编写iPhone应用程序,而不必担心内存管理。

答案 6 :(得分:0)

他们刚刚在这个

上有一个Dot Net Rocks节目

http://www.dotnetrocks.com/default.aspx?showNum=454

他们提到了mono项目以及Objective C 2.0将具有更好的内存管理功能的事实。除此之外,它很糟糕。

编辑:修复了错误的拼写错误

答案 7 :(得分:0)

从Java或Python(我做过)来看可能很尴尬,但是一旦你习惯它,它就很自然了。您拥有使用alloccopy创建的对象,并且必须释放它们,否则不会释放它们。大多数情况下,您将创建自动释放的对象(集合,字符串)。