【发布时间】: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