当EXC_BAD_ACCESS
触发选择器时,我正在绘制网格视图并遇到UIButton
错误。打开僵尸对象给我的信息是:
*** -[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被过早释放的可能性。
所以我做了这个黑客:
在名为NSMutableArray
的BazViewController中创建一个viewControllers
ivar&属性并执行此操作:
BazViewController *baz = [[BazViewController alloc] initDesignatedInitializer];
FooViewController *foo = [[FooViewController alloc] initDesignatedInitializer];
[baz.view addSubview:foo.view];
[baz.viewControllers addObject:foo];
但我仍然遇到同样的错误。
我继续在处理网格的视图控制器上执行上述操作。 (创建一个视图控制器数组,并在创建该对象时将对象添加到其中)。仍然没有骰子。任何人都可以推荐另一种方法来防止这个vc过早发布吗?
答案 0 :(得分:3)
我自己解决了这个问题。
我使用addChildViewController
来添加对相应vc的强引用,而不是创建数组。没有过早的释放和没有僵尸物体。
BazViewController *baz = [[BazViewController alloc] initDesignatedInitializer];
FooViewController *foo = [[FooViewController alloc] initDesignatedInitializer];
[baz.view addSubview:foo.view];
[baz addChildViewController:foo];
答案 1 :(得分:1)
在创建它的类中创建一个FooViewController
属性,并为该属性赋予strong
属性。分配给它而不是局部变量。