【问题标题】:initWithContentsOfFile Plist in viewWillAppear memory leakinitWithContentsOfFile Plist in viewWillAppear 内存泄漏
【发布时间】:2012-05-22 10:18:14
【问题描述】:

我正在 ViewVillAppear 中加载我的 plist 文件,如下所示。在第一次加载时我没有泄漏但是按下其他 tabBar 按钮/项目并返回到这个视图我得到了泄漏。我已经在 dealloc 中发布了这个 NSMutableArray 但是它仍然泄漏。有点困惑为什么。 (theProducts3 是一个 NSMutableArray,就像 .h 中的 ivar 一样,它不是 @property 或保留的)

- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];  

NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; NSString *plistPath = [rootPath stringByAppendingPathComponent:@"basket.plist"];
theProducts3 = [[NSMutableArray alloc] initWithContentsOfFile:plistPath];

NSLog(@"Number of objects in item array %i", [theProducts3 count]);
}

在这里释放 NSMutable 数组。

-(void)dealloc{
[theProducts3 release];
[super dealloc];
}

任何指针最感激!谢谢...

【问题讨论】:

  • 不,不要自动释放它,这会导致间歇性崩溃。由于没有其他东西保留该数组,它将被释放,您将留下一个悬空指针。

标签: ios memory-leaks nsmutablearray plist initwithcontentsoffile


【解决方案1】:

dealloc 不是viewWillAppear: 的倒数。它是alloc 的倒数。 viewWillAppear: 的倒数是viewWillDisappear:

发生的情况是,当您的视图出现时,您正在分配内存,然后您将转到另一个视图控制器,然后返回,您的视图再次出现,您正在分配更多内存,从而泄漏原始记忆。

如果你的数组只需要在你的视图在内存中停留,那么在viewDidLoad:中分配它并在viewDidUnload:dealloc中释放它。释放后记得将实例变量设置为nil

【讨论】:

  • 非常感谢。我对一些男性管理有一点误解。但我正在学习。我只是假设对于每个分配,您必须释放该对象,但是该对象由您上面提到的视图保留,对吗?您能否也简单地向我描述一下为什么在释放对象后需要将它们设置为 nil ?我曾经修复过一天早些时候的另一个泄漏,但我并不真正理解为什么设置 nil 会修复我之前提到的问题。再次感谢!
  • 您最好阅读the documentation,但简而言之:当您调用包含newallocretaincopy 的方法时,您拥有该方法的所有权对象,您有责任释放它。你打电话给alloc,所以你有责任释放它。
  • 如果你释放一个对象,那么你还必须将指向它的任何指针设置为nil,否则你有一个指向内存的指针,它随时可能被覆盖——如果你取消引用它指针,它很可能会使您的应用程序崩溃。因此,为了确保您不这样做,当您释放一个对象时,请将指向它的指针设置为 nil
  • 与 ARC 的关系要少得多,但除非在转向之前了解这些内容,否则您可能同样会迷失方向。
  • 谢谢,是的,我已经阅读了很多文档,但是有些东西需要一段时间才能理解。感谢您提供的额外信息,这很有意义。我会使用 ARC,但我正在为 iOS 5 以下构建应用程序,所以这是不可能的。我大部分时间都可以很好地管理男性管理,但是直到现在我还没有使用 viewWIllAppear。现在我知道当我阅读它时会更加明显。感谢您的帮助!
猜你喜欢
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
  • 2019-08-06
  • 2012-06-12
  • 2010-09-16
  • 2011-02-22
  • 1970-01-01
相关资源
最近更新 更多