【问题标题】:Objects releasing on iOS 6 but not in iOS 5在 iOS 6 上发布但在 iOS 5 中未发布的对象
【发布时间】:2013-02-12 23:30:50
【问题描述】:

我在第一代测试时遇到了一个非常奇怪的问题。 iPad(运行 iOS 5)。

我有一个 UIView 用作属性(带有保留)。我 nil 父视图的 dealloc 方法中的属性。很基本的东西。它在我运行 iOS 6 的 iPad 3 上完美运行,但没有在我的第一代发布。

有什么想法吗?

我没有使用 ARC。

【问题讨论】:

  • 我认为在 6 中他们改变了 NIB 中视图的保留方式。这个视图在 NIB 中吗?
  • 不,不是。我所有的观点都是程序化的。
  • 你确定父视图的 dealloc 被调用了,我问是因为它可能是父视图的问题。
  • 我已经记录了所有的 dealloc,并且正在调用父视图 dealloc。

标签: xcode ios5 memory-management ios6


【解决方案1】:

如果你保留它,你必须释放它。你不能只 nil 实例变量。

所以如果你的财产看起来像这样:

@property (nonatomic, retain) UIView *myView;

你的 dealloc 可能看起来像这样:

- (void)dealloc
{
    [myView release], myView = nil;
    [super dealloc];
}

或者这个:

- (void)dealloc
{
    [self setMyView:nil];
    [super dealloc];
}

或者这个:

- (void)dealloc
{
    self.myView = nil;
    [super dealloc];
}

您的财产将被妥善释放——除非有其他东西保留它。

【讨论】:

  • 更正。你可以“只清零”属性并让它释放。但是,在 5 或 6 上将 instance 变量 设置为 nil 不起作用(除非您使用的是 ARC)。
  • @HotLicks 我总是将属性设置为 nil,效果很好。我怀疑还有别的问题,我目前正在调查它。有什么想法吗?
  • @daveMac - 关于视图的链接方式,在 5 和 6 之间发生了变化……不知道细节。通过将 retainCount 的日志放在代码中的各处,您或许可以获得一些见解(通常需要注意的是,retainCount 正式“无意义”)。
  • Matt - 感谢您澄清/修正您的答案。我已经了解属性的工作原理,但也许这对其他人有帮助。
【解决方案2】:

所以我想通了。这似乎是 iOS 6 SDK 中的一个错误,或者我只是不明白。我有一个 UIViewController,它通过 presentViewController:animated:completion: 呈现另一个 vc——如果我关闭呈现的 vc,它就会释放,随后所有子视图都被删除,一切都很好。

但是,如果在呈现的 vc 显示时,我删除/销毁了父 vc,呈现的 vc 被释放,但是它的子视图没有被告知 removeFromSuperview;这不会显示为仪器中的泄漏,它确实会阻止子视图解除分配。

这在 iOS 6 上不会发生,因此我怀疑这是 iOS 5 中的一个错误。一切都会像在 iOS 6 上所期望的那样释放/解除分配。

如果有人对此有解释或更好的理解,我很乐意将答案奖励给他们而不是我自己。

【讨论】:

    【解决方案3】:

    当视图控制器被解除分配时,视图控制器不负责从父视图中删除其视图。视图控制器只负责释放它自己对它的引用。

    例如:您可以创建一个视图控制器,请求它的视图,然后将该视图添加到另一个视图并丢弃该视图控制器。在这种情况下,您只是将视图控制器用作视图构建器。

    我不确定为什么 iOS 6 中的行为有所不同,但我很想知道。

    【讨论】:

    • 通过api之类的presentViewController然后dismissViewController,视图从superview中移除。此外,视图显然不再显示。如果父视图控制器视图被移除,难道不应该移除所有子视图吗?
    • 那么,您正在删除和销毁父 VC,该父 VC 的视图会发生什么变化?是否正在解除分配?
    • 我将如何确定?当您删除和销毁vc时,它不应该自动被dealloc'd吗?
    • 您只能保证 VC 会在其视图中释放它的保留。 presentViewController 可能会导致某人在视图上添加保留。就像我之前所说的那样——VC 可以用作视图构建器,然后只要该视图被仍然存在的人保留,就可以被丢弃。我想如果你真的想追踪这个,子类化视图并登录它的dealloc。
    • 我理解……但是,在 iOS 5 中保留视图的任何东西不应该在 iOS 6 中保留视图吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    相关资源
    最近更新 更多