【问题标题】:How to solve a memory leak如何解决内存泄漏
【发布时间】:2013-01-14 09:20:02
【问题描述】:

下面的代码在分析时显示了内存泄漏。

ContentViewController *dataViewController;
dataViewController = [[ContentViewController alloc]initWithNibName:@"ContentViewController" bundle:nil];

dataViewController.DocumentPath = [self.modelArray objectAtIndex:index];
return dataViewController;

我该如何解决这个泄漏,任何想法请帮助我。

【问题讨论】:

  • 使用ARC(自动引用计数)
  • 您应该提供更多代码;具体来说:你如何处理返回值?
  • 当有人问如何解决内存泄漏时,告诉他们只使用 ARC 就像告诉一个游泳池有泄漏的人只使用另一个没有泄漏的游泳池。你没有告诉他们如何解决他们遇到的问题。您是在告诉他们花费时间、资源和精力来做出不会教育他们的改变。
  • @AnoopVaidya 不同意.. 不使用 ARC 没有任何问题,只要您了解手动内存管理概念。对于那些努力学习/应用手动内存管理概念并在此基础上编写出色应用程序的老派开发人员来说,ARC 并没有提供任何新的或有吸引力的东西。
  • @AnoopVaidya 这完全无关紧要。无论您驾驶的是 Wright Brothers 飞机还是 Concord 飞机,了解飞机的工作原理都非常重要。仅仅因为协和为您自动执行操作并不意味着您不应该了解使飞机保持在天空中的物理概念。了解如何使用 Obj-C 的内存管理非常有用,即使在使用 ARC 时也会对您有所帮助。有些代码区域不能使用 ARC,或者可能需要特殊的桥接注意事项,并且了解手动内存管理的工作原理在这些情况下非常有用。

标签: iphone ios objective-c ipad memory-leaks


【解决方案1】:

如果您不使用 ARC。

当你从方法返回一个对象时,返回一个自动释放的对象:

return [dataViewController autorelease];

我建议使用 ARC 是一个不错的选择。因为它比手动内存管理要好得多。 ARC 是一个编译时功能,它会在您编译源代码时自动为您添加保留、释放调用。

【讨论】:

  • @AnoopVaidya:那么上面的代码可能是正确的。以上代码在ARC模式下没有错误。
  • 你的答案可能是对的,但不是很好,只要我们不确定 OP 是否使用 ARC
  • @Krishnabhadra:你是对的,我编辑了我的答案。我认为除了return语句之外,上面的代码没有问题。这就是为什么我这样添加我的答案:)
【解决方案2】:

我认为可以安全地假设提问者使用手动内存管理而不是 ARC,因为我不相信这段代码会在 ARC 下泄漏。

话虽如此,Midhun MP 的回答是正确的。返回的对象需要自动释放以解决眼前的问题。但我想补充一些信息,说明为什么这会被分析工具视为泄漏。

Objective-C 在方法上使用命名约定来确定它们的内存管理语义。例如,一个名为newPerson 的方法应该会返回一个对对象的拥有引用(即保留计数为+1 的对象)。一个名为 person 的方法应该会返回一个自动释放的对象,(即没有拥有引用的对象)。

在第一种情况下,方法的调用者拥有对象,并期望在完成时释放它。第二种情况说明调用者不必担心释放对象(因为它不是拥有的)。

我喜欢用来记住约定的一种简单方法是我学到的 CARN 规则。

  • C操作
  • 一个 lloc
  • R保留

在 Cbjective-C 中,任何包含这些词的方法都应返回对其返回对象的拥有引用。

因此,总而言之,如果您打算从您的方法中返回一个拥有的对象,请修改其名称以包含上述单词之一,否则,自动释放您返回的对象。

【讨论】:

    猜你喜欢
    • 2015-06-28
    • 1970-01-01
    • 2021-11-18
    • 2018-04-11
    • 2020-04-07
    • 1970-01-01
    • 2013-09-02
    相关资源
    最近更新 更多