Search code examples
iosuiviewcontrollerautomatic-ref-countingnszombie

Prematurely deallocated view controller


I am drawing a grid views and experiencing an EXC_BAD_ACCESS error when UIButton fires off a selector. Turning on zombie objects gives me the message:

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

Here is what I am doing:

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

I am running this on ARC, so I could see the possibility of FooViewController being prematurely deallocated.

So I did this hack:

Create an NSMutableArray ivar&property in BazViewController named viewControllers and did this instead:

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

But I still get the same error above.

I proceeded to do the equivalent of the above on the view controller that deals with the grid. (Create a view controllers array, and add the object into it at time of that object's creation). Still no dice. Can anyone recommend a another way to prevent this vc from being prematurely released?


Solution

  • I resolved this issue myself.

    Instead of creating arrays I used addChildViewController to add a strong reference to the appropriate vc's. No premature deallocation and no zombie objects.

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