0

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

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

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

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

4

2 回答 2

4

如果您不使用 ARC。

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

return [dataViewController autorelease];

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

于 2013-01-14T09:22:04.840 回答
1

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

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

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

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

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

  • 复制_
  • 一个lloc
  • 保留_

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

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

于 2013-01-14T09:58:41.333 回答