【问题标题】:Memory leaks in my application我的应用程序中的内存泄漏
【发布时间】:2011-09-16 07:06:32
【问题描述】:

我正在开发一个 IOS 应用程序。在 Xcode 中,我将分析应用程序 Run->analyze 它显示了 47 个潜在的内存泄漏我检查了所有情况在大多数情况下不可能释放内存,在 appstore 中启动应用程序时会不会有任何问题? 我已经彻底检查了应用程序,它没有在任何地方崩溃,也没有在任何地方显示低内存警告。 由于我是 IOS 开发的新手,请建议我对此能做些什么

在 viewDidUnload 方法中释放内存是否足以避免内存泄漏?

【问题讨论】:

  • 只使用ARC。我在使用它时从未遇到过内存泄漏。

标签: objective-c ios4 memory-leaks


【解决方案1】:

如果它没有显示任何内存警告,它可能不会被拒绝。但是构建带有泄漏的应用程序通常不是好的编程。你为什么不解决这些泄漏?没有一种情况是您无法释放分配的。在需要的地方使用自动释放或将释放消息传递给元素。

此外,为了更好地分析您的应用,请使用 INSTRUMENTS 运行该应用,它会让您更好地了解泄漏的来源。

编辑:如何使用 Instruments 运行应用程序。

当您在 Xcode 中时,单击顶部菜单栏中的运行。在本部分中,进入 Run with Performance Tools,然后选择 Leaks

要了解如何使用 Instruments,请转至 here

【讨论】:

  • 你能告诉我如何使用 INSTRUMENTS 运行应用程序
【解决方案2】:

注意:我还没有机会使用一些最新的功能,比如 ARC,所以现在可能会也​​可能不会过时。

是的,这可能是个问题。根据 Apple 的说法,这是他们会检查的一件事。然而,似乎没有什么能保证苹果的审查团队会拒绝(或接受)。然而,也许更重要的是,您希望自己作为应用程序开发人员的声誉良好,您希望从事让人们的手机为他们更好工作的业务。

做得对,你将永远释放你用 new 或 alloc 创建的任何对象。

但是,为了防止、追踪和消除您需要使用的内存泄漏:
1.分析
2. 仪器泄漏
3. 您自己的分析,并在需要时进行同行评审
4. 干净的编码、最佳实践和模式

在使用 Instruments Leaks 分析工具时,请使用您的应用并尝试访问所有不同的执行路径。查看对象是否显示为泄漏。我通常按​​泄漏的总大小(对象大小 * 泄漏数)进行优先级排序,然后逐步降低直到没有泄漏出现。单击该对象将显示该对象最初分配位置附近的某个位置。

我发现即使是 Instruments 也可能无法明确捕获所有内存泄漏。

在这方面可能会有所帮助的另一个技巧是推断出您可以在应用中创建的一些不同“循环”,一旦您返回“家”,您的应用应该具有与上次相同的内存占用在那里。例如,从主屏幕开始,执行活动 X,然后执行活动 Y,然后返回主屏幕。假设您期望,在第一个循环之后,第二次和第三次回到主屏幕,内存占用应该是相同的。然后,您可以使用连接的仪器和分配次数来练习。这可以为您提供一些有价值的信息。

保留周期可能会发生一些有趣的事情,当您在类之间存在循环依赖时可能会发生这种情况,并且在尝试使用块做某些事情时很容易发生这种情况。

当对象在应用程序的整个生命周期内持续存在时(如单例),您可能会忽略有关内存泄漏的警告。我的意见是消除警告并在某处释放对象,以保持清洁。

构建时零编译器和零分析器警告也会让您感觉非常好!

【讨论】:

    【解决方案3】:

    如果您在模拟器上进行测试,您可能永远不会看到内存不足警告。但无论如何,所有内存泄漏都应该是可修复的,除了 Apple 框架中存在的那些(其中可能并不多)。

    Analyze 返回什么样的信息?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-24
      • 2013-03-26
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多