在Objective C中检查内存分配的正确方法

Ari*_*iel 7 memory iphone memory-management objective-c ios

我想知道在执行一个在Objective C中分配内存的命令之后会有什么正确的方法(我主要是指iOS应用程序).我的困境来自这样一个事实,即检查内存分配操作失败是否成功会增加许多行代码,同时想知道这是否有用.此外,有时内存分配是显而易见的,例如使用'alloc',但有时它们发生在幕后.即使我们检查每一个分配 - 当我们发现它失败时 - 我们实际上并没有做太多.所以也许正确的方法是让它失败并让应用程序崩溃?看看这段代码:

// Explicit memory allocation
NSArray a1 = [[NSArray alloc] initWithObjects:someObj, nil];
if (!a1) {
  // Should we make this check at all? Is there really what to do?
}

// Implicit memory allocation
NSArray a2 = [NSArray arrayWithObjects:someObj, nil];
if (!a2) {
  // should we make this check at all? Is there really what to do?
}
Run Code Online (Sandbox Code Playgroud)

你认为什么是正确的方法?检查或不检查分配失败?iOS开发人员在那里 - 您如何在应用程序中处理它?

bbu*_*bum 11

幻想:将检查每个内存分配,并以友好的方式向用户报告任何故障,应用程序将干净地关闭,将发送错误报告,您可以修复它,下一个版本将是完美的[在一例].

现实:当一些微不足道的事情arrayWithObjects:失败时,你的应用程序已经很久很久了.在这种情况下没有恢复.框架很可能已经失败了,并且已经破坏了应用程序的状态.

此外,一旦基本arrayWithObjects:功能失败,您无论如何都无法告诉用户.如果没有进一步的分配,您将无法在屏幕上可靠地放置对话框.

但是,在您的应用程序分配失败之前,失败发生得更远.也就是说,您的应用程序应该已收到内存警告,并应响应(a)持久状态,以便不丢失客户数据;(b)尽可能多地释放内存以避免灾难性故障.

尽管如此,记忆警告仍然是内存使用战争中最后一道可行的防线.

您对减少内存的第一次攻击是在设计和开发过程中.您应该从应用程序开发过程的开始就考虑使用内存,并且在优化应用程序以进行发布时必须优化内存使用.使用分配工具(请参阅我之前做过的快照分析报告 - 它非常适用)并证明每个主要的内存消费者的存在.


Jas*_*ers -2

凭借 Iphone/智能手机的强大功能,计算一些测试所需的时间对于思考“是否真的值得检查”来说是荒谬的,它始终是很好的测试并捕获代码/分配中的任何故障。(如果你不这样做,听起来更像是你懒惰地在代码中添加了一些额外的行。

此外,“让应用程序崩溃”会给您的应用程序留下非常糟糕的印象,用户看到应用程序无缘无故地关闭,并认为它是一个质量很差的软件。您应该始终添加测试,如果您无法对错误采取任何措施,那么至少应该在应用程序关闭之前显示一条消息(让用户不那么沮丧)。

跟踪内存分配时有几个选项,例如捕获异常。测试返回的指针是否为零,检查列表的大小等。

您应该想办法让您的应用程序在分配失败的情况下运行:

  • 如果它只是界面的视图,则显示一条消息,指出无法加载特定视图...

  • 如果它是主要且唯一的视图,请优雅地关闭应用程序并显示一条消息

...

我不知道您正在开发什么应用程序,但如果您内存不足,您应该考虑创建一个系统来随着应用程序的进展分配已释放的内存,以便您始终拥有最大的可用内存。它可能比保留所有内容缓存稍慢,但如果您抑制任何强制关闭,您的应用程序质量将会提高。

  • 如果您无法为 20 字节对象分配内存,祝您显示消息好运:-) (5认同)
  • 如果分配失败,“就让它崩溃”是唯一的办法。无法保证任何底层系统状态无论如何都足以向用户报告任何有用的内容。 (2认同)