【问题标题】:Analyzing memory leaks on iPad project分析 iPad 项目上的内存泄漏
【发布时间】:2012-02-01 11:22:47
【问题描述】:

我已经创建了一个 ipad 应用程序,现在我正在使用 Instruments 进行一些测试,以发现内存泄漏和其他问题。

我发现了一些泄漏,但我不明白为什么它们被认为是内存泄漏......有人可以帮我理解吗?

NSMutableArray *secondArray = [NSMutableArray arrayWithArray:firstArray];

为什么这是内存泄漏?它不会创建一个自动释放的数组吗?

【问题讨论】:

  • 泄漏显然与这行代码无关。你没告诉我们什么?

标签: ios objective-c memory-leaks nsmutablearray


【解决方案1】:

arrayWithObjects 产生一个自动释放的数组,但使用arrayWithArray,您将在secondArray 中保留firstArray,之后不会释放firstArray

【讨论】:

  • 我检查了我的代码,但是 firstArray 是 ay 被定义为属性并被保留,并且在 release 中的 dealloc,所以我认为它是正确的。
  • stackoverflow.com/questions/661233/… 所以在调用 dealloc 之前,您可能会有大量的泄漏。这就是内存管理问题如此重要的原因。因为在调用 dealloc 之前应用程序可能会崩溃很长时间。我通常甚至不会考虑 dealloc,而是尝试查看视图控制器的生命,因为它不存在。我在 dealloc 中释放所有对象作为标准化。
【解决方案2】:

确实如此!但是 firstArray 呢?您将其保留在 secondArray 中而不复制它。所以你可能应该像这样发布firstArray

NSArray *firstArray = [NSArray alloc] init];

...

NSMutableArray *secondArray = [NSMutableArray arrayWithArray:firstArray];
[firstArray release];

【讨论】:

  • 也许我遗漏了什么,但为什么 secondArray 保留第一个?
  • 感谢回复:firstArray被定义为属性并被保留,并且在dealloc中释放,所以我认为它是正确的。
  • @MarcoPace,firstArray 是 iVar。如果它是一个属性,那么您将它用作 self.firstArray。
  • @beryllium,firstArray 使用 arrayWithArray 选项保留在 secondArray 中。这意味着 secondArray 也持有对 firstArray 的引用;从而将保留计数器增加 +1。然后,您必须释放 firstArray 以减少保留计数器,以便在释放 secondArray 时 firstArray 上的计数器变为零并因此被释放。很抱歉在这里不清楚,但我希望你能得到图片 =)
  • @helk,不,你不正确。 arrayWithArray 返回自动释放的对象,它不会增加retainCount。
【解决方案3】:

好吧,我还是写我的答案。

这一行没有内存泄漏。您创建secondArray,它指向来自firstArray 的相同对象。 arrayWithArray 返回自动释放的对象,所以你不必释放它。

但我猜分析器说,当您有多个指向一个对象的指针时,这是一种潜在的情况。而当你释放 firstArray 时, secondArray 将引用未定义的内存。它可以导致 SIGABRT。

【讨论】:

    猜你喜欢
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多