【问题标题】:Prematurely deallocated view controller过早释放的视图控制器
【发布时间】:2012-06-11 17:11:07
【问题描述】:

UIButton 触发选择器时,我正在绘制网格视图并遇到EXC_BAD_ACCESS 错误。打开僵尸对象给我的信息是:

*** -[FooViewController performSelector:withObject:withObject:]: message sent to deallocated instance 0x91818f0

这是我正在做的:

BazViewController *baz = [[BazViewController alloc] initDesignatedInitializer];
FooViewController *foo = [[FooViewController alloc] initDesignatedInitializer];
[baz.view addSubview:foo.view];

我在 ARC 上运行它,所以我可以看到 FooViewController 被过早释放的可能性。

所以我做了这个破解:

在名为 viewControllers 的 BazViewController 中创建一个 NSMutableArray ivar&property 并改为这样做:

BazViewController *baz = [[BazViewController alloc] initDesignatedInitializer];
FooViewController *foo = [[FooViewController alloc] initDesignatedInitializer];
[baz.view addSubview:foo.view];
[baz.viewControllers addObject:foo];

但我仍然遇到上述相同的错误。

我继续在处理网格的视图控制器上执行与上述相同的操作。 (创建一个视图控制器数组,并在创建该对象时将对象添加到其中)。还是没有骰子。谁能推荐另一种方法来防止此 vc 过早发布?

【问题讨论】:

  • 您的示例代码无效:它使用 FooViewController 和 BazViewController 作为类型名称和变量名称。这使得很难判断发生了什么:BazViewController 是否被分配给局部变量?是什么负责保留它?
  • 代码风格已更正,虽然我正在编写伪代码
  • 在我尝试的解决方案中,我在父视图控制器中创建了一个强大的可变数组属性,并添加了所有子视图控制器,希望这种强烈保留的引用会导致 ARC 不会过早地释放它们的内存。
  • 伪代码对于找出丢失的保留位置几乎没有帮助。什么是保留父 VC?
  • VC 层次结构是 UINavigationController > GridViewController > BazViewController > FooViewController; GridViewController 是一个 UIStoryboard 场景,它有一个强大的数组属性来保存所有的 BazViewControllers,每个 BazViewController 都有一个类似的 FooViewControllers 的强数组属性

标签: ios uiviewcontroller automatic-ref-counting nszombie


【解决方案1】:

我自己解决了这个问题。

我没有创建数组,而是使用addChildViewController 来添加对适当 vc 的强引用。没有过早的释放,也没有僵尸对象。

BazViewController *baz = [[BazViewController alloc] initDesignatedInitializer];
FooViewController *foo = [[FooViewController alloc] initDesignatedInitializer];
[baz.view addSubview:foo.view];
[baz addChildViewController:foo];

【讨论】:

    【解决方案2】:

    在创建它的类中创建一个FooViewController 属性,并为该属性赋予一个strong 属性。分配给它而不是局部变量。

    【讨论】:

    • 如果父视图控制器内部有 1,2 或 3 FooViewControllers 的情况怎么办?为所有 3 个创建属性并根据需要使用它们?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 2011-09-20
    • 2012-05-07
    相关资源
    最近更新 更多