【问题标题】:Why does my NSMutableArray cause a leak?为什么我的 NSMutableArray 会导致泄漏?
【发布时间】:2010-07-18 22:53:03
【问题描述】:

这就是 Instruments 所指的。

students = [[NSMutableArray alloc] initWithArray:[course.students allObjects]];

我在 dealloc 中释放数组。在我的其余代码中,我只调用数组,而不会再次分配它。我也尝试过通过快速枚举填充数组,但我遇到了同样的问题。

【问题讨论】:

  • 也许您可以尝试运行 Clang 静态分析器(在最近的 Xcode 中:构建 -> 构建和分析)。仅凭这段代码,我们无法准确判断发生了什么。
  • 我使用了构建和分析。首先,我必须阅读它,因为我从未听说过它。我没有收到学生的任何消息 = ... 是否有一个窗口可以在您分析后告诉您所有可能的问题?
  • 这是我所有处理“学生”的代码: 1.) self.students = [[[NSMutableArray alloc] initWithArray:[course.students allObjects]] autorelease]; 2.) 行数 = [学生人数] + 1; 3.) cell.textLabel.text = [[学生 objectAtIndex:(indexPath.row-1)] name]; 4.) 学生 *student = [students objectAtIndex:row]; 5.) [学生移除对象:学生]; 6.) [学生放行];

标签: iphone memory-leaks


【解决方案1】:

为了确定,添加一个autorelease,比如

students = [[[NSMutableArray alloc] initWithArray:[course.students allObjects]] autorelease];

然后看看会发生什么。 (顺便说一句,也许将其分配给 self.students,并使用 @property (nonatomic,retain) 将其设为保留属性)

【讨论】:

  • 使用自动释放实际上使情况变得更糟。在我遇到错误的代码后, Instruments 运行速度非常慢,并且使用自动释放它会运行得更慢甚至冻结 Instruments。我不得不重置我的电脑。
  • 看起来你必须释放它是正确的。在我的代码中的某个地方,我发布了一个 Student *student,但我从未分配过它。显然,即使我再也没有使用过那个学生,这也弄乱了我的学生数组。我没有意识到 initWithArray 返回了一个分配和初始化的数组,它将保留计数设置为 2。谢天谢地,仪器碰巧让我看到了保留计数,因为据我所知,它只做了一次。再次感谢。
  • 问题解决了吗?不过要注意这样的保留计数;在allocinitWithArray 之后,我认为保留计数应该只是一个。第二个可能是您持有该对象 - 但是,在您完成功能后,自动释放会起飞。 (这只是我的经验,但我很快就学会了不是解释保留计数,而是查看代码)
猜你喜欢
  • 2013-07-12
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多