【问题标题】:iPhone - Memory Management - Am I creating and releasing this variable correctly?iPhone - 内存管理 - 我是否正确创建和释放此变量?
【发布时间】:2010-08-18 21:06:04
【问题描述】:

好的,情况就是这样。我有一个用作主视图(MainView)的视图控制器类。它包含另一个视图控制器处理的子视图(ChangingView)。现在,每四秒,ChangingView 需要改变它的视图。我目前正在做的事情是这样的。

ChangingView = [[AnotherView alloc] initWithNibName:@"AnotherView" bundle:[NSBundle mainBundle]];
[MainView addSubview:ChangingView.view]; 

现在,在 4 秒结束后和排队之前,我会执行以下操作。

[ChangingView release];
[ChangingView.view removeFromSuperview];

正在发生的事情是我收到疯狂的内存警告。最终它给了我“程序发送'0'”或“数据格式化程序当前不可用”的调试消息。我相信这两个都意味着我没有记忆。我认为这不应该发生,因为视图中的内容量不是多 MB,因此出于某种原因它必须堆叠或其他东西。如果您需要任何澄清,请询问,任何帮助将不胜感激,因为我目前很难过。提前致谢。

【问题讨论】:

  • 你在做什么需要你真正释放和重新加载你的视图?你不能就地更新数据吗?
  • 我正在制作一堆小游戏。每个“游戏”都有一个以它命名的视图控制器类。因此,如果我想“获得”一个新的迷你游戏,我只需将 ChangingView = 设置为我想要的任何迷你游戏的新分配。

标签: iphone memory memory-management


【解决方案1】:

这两行代码让我很不爽:

[ChangingView release];
[ChangingView.view removeFromSuperview];

我认为,您可以在发布后实际访问 ChangingView.view 而不会出现 EXC_BAD_ACCESS 错误,这意味着您没有在任何地方正确发布 ChangingView(顺便说一下,您应该调用 ChangingView* **Controller***以免让人混淆它是UIView的子类还是UIViewController)。

检查是否真的调用了ChangingView 的dealloc 方法。曾经。没有足够的信息或代码来告诉您忘记发布它的位置,但我敢打赌这就是问题所在。

【讨论】:

  • 好吧,我的代码中的这两行代码不是按这个顺序排列的。 removeFromSuperview 在发布之前调用。我在将变量设置为新实例之前发布。我按照你的要求做了,它确实击中了每一个 dealloc。泄漏工具显示没有泄漏,但由于某种原因,内存只是攀升。不知道为什么我要释放变量本身并删除视图,所以对我来说似乎应该什么都没有了。
  • 如果您按其他顺序调用它们,那么为什么要按该顺序列出它们?视图层次结构在 Leaks 中不会显示为泄漏,因为子视图维护对其父级的引用,并且 Leaks 进行了相当愚蠢的泄漏检测,它认为循环结构没有泄漏。如果您有 IBOutlets,未能在 dealloc 中释放它们是泄漏泄漏的一种简单方法,Leaks 无法捕获 - 通常您应该使用属性并执行self.myOutletThingy = nil
  • 所以如果我创建了一个 IBOutlet 变量(例如 IBOutlet UIImageView *bkgd),那么我需要在 dealloc 中输入 bkgd = nil?
  • self.bkgd = nil (注意 self. 使用了属性方法并会释放它),但是是的。
  • 哦,废话。我不认为我使它们成为属性。如果我没有将它们设为属性并返回并重新制作所有属性,我需要用 self.etc 替换所有内容,例如我的 var 更改视图。我现在会做 [self.ChangingView 发布]、self.ChangingView.view 等吗?
【解决方案2】:

(我最初说不,但我错过了发布后来发生的事实,他正在保存视图控制器引用)。

如果您看到内存使用量攀升,请确保您作为子视图添加的视图已真正释放...这也是使用 Instruments 尝试跟踪分配的内容的好主意,并且已解除分配。

【讨论】:

  • 我在上面发表了评论,以进一步解释我想要做什么。我不能只有一个视图控制器实例,因为它继承的类是视图控制器本身。
  • 保持你创建的视图控制器的每个实例。如果它们需要在数量上是动态的,你可以将它们保存在 NSArray 中......但你不能让它们自动释放,你不能在不保留引用的情况下保留它们。
  • 他根本没有扔掉 ViewControllers。如果上面的代码是正确的,他也会删除视图,所以当视图控制器被抛出时,视图也会被抛出。
  • 好吧,我错过了四秒后发布和删除的部分(或者我第一次看到它时可能有一些编辑??)。我现在要完全修改我的回复,所以任何阅读的人都忽略了上面的 cmets...
猜你喜欢
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
  • 2014-11-23
  • 1970-01-01
  • 2015-06-21
  • 2017-12-26
  • 1970-01-01
相关资源
最近更新 更多