过早释放视图控制器

时间:2012-06-11 17:11:08

标签: ios uiviewcontroller automatic-ref-counting nszombie

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过早发布吗?

2 个答案:

答案 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属性。分配给它而不是局部变量。