代码之家  ›  专栏  ›  技术社区  ›  Rob

自动释放iPhone

  •  2
  • Rob  · 技术社区  · 16 年前

    到了开发iPhone应用程序的最后,我想知道在为iPhone开发时使用Autorelease有多糟糕。我面临着一些相当随机的崩溃,到目前为止,我无法将其精确地定位到任何其他地方,除了草率的内存使用。

    作为一个可可新手,我记得我最初读过一份指导性文件,强烈建议避免自动释放,而不是手动保留/释放iPhone。然而,一个更“高级”的可可开发者很早就登船了(讽刺的是,自那以后,他就被放手了),他在各地使用了自动租赁。不可否认,我进入了“猴子看猴子做”的模式,它似乎回来困扰我(我现在是项目的唯一开发人员)。

    那么接下来该怎么办呢?在我看来,我必须对代码进行分支,并在可能的情况下尝试遍历和替换保持交叉的自动释放代码,这样我就不会无意中破坏应用程序。似乎很多库调用都会导致像StringWithFormat这样的自动释放对象,以及几乎所有我自己不使用alloc的对象。我还应该寻找其他的哥德基和/或建议吗?感谢可可大师。

    6 回复  |  直到 12 年前
        1
  •  12
  •   Marc Charbonneau    16 年前

    使用release而不是autorelease可以在内存不足的地方提高内存使用率(这在iPhone上很好),但是如果您不遵守retain/release规则,它根本就不会帮助您崩溃。如果你仍然对应该做的事情有点模糊,我会在obj-c中阅读一些关于内存管理的教程,然后使用调试器和崩溃报告来处理这些崩溃,以找出你过度释放对象的地方。 This this 是两个好的起点。

        2
  •  4
  •   rpetrich    16 年前

    比自动释放或手动释放选项更重要的是您 alloc dealloc 你的 NSAutoreleasePool 因为大多数Cocoa框架都使用 autorelease 自由地说,你需要有一个适当的水池排水策略。一旦确定了,就可以选择是否 release 自动复位 不再是一个问题。

    也就是说,您唯一需要担心的是紧密循环——分配和释放一个 自动释放池 每隔几次迭代就可以得到最好的结果;当你产生了另一个 NSThread 它没有runloop——创建一个池,然后每隔一段时间将其排空,这样就会变得空闲。由于大多数应用程序只为每个事件分配少量数据, UIKit 在调度事件之前分配池并在调度返回之后释放池的策略非常有效。

        3
  •  2
  •   taevanbat    14 年前

    如果您认为您不知道如何使用Autorelease,请查看iTunes U->第4课2010年秋季的CS193P。

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

        4
  •  0
  •   August    16 年前

    出于iPhone性能的原因,苹果建议,只要有可能,就不要使用自动释放的对象。相反,在处理完对象后显式地释放它们。

        5
  •  0
  •   has    15 年前

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

        6
  •  0
  •   Saad Ur Rehman    12 年前

    当你自动释放的时候,你基本上是说:“我不再需要这个了,但是其他人都可以自由地把它捡起来(在自动释放池被清空之前)”。当您显式地重新传递一个对象时,您会说:“我不再需要这个了,除非其他人已经说过了(获得的),否则应该立即释放它。”

    因此,自动释放通常不是错误的事情。如果要将对象传递回邮件的发件人,而不要求发件人负责释放对象,则需要执行此操作。