Question

I have a custom ViewController which is an instance variable of my root viewController.

I intend to modally present it whenever a button is touch. Therefore the viewController will be presented and dismissed potentially many many times.

I obviously only want to alloc init my instance variable once as the modal viewController is not deallocated each time it's dismissed, so should I have code like this inside my button action to ensure that it's only alloc and inited once?:

if(!myViewController)
{
    ViewController *myViewController = [[ViewController alloc] init];  
}
[self presentViewController:myViewController animated:YES completion:NULL];
Was it helpful?

Solution

I usually use lazy instatiation in those cases:

Declare a property for your ViewController:

@property(nonatomic, strong) UIViewController *myViewController;

After that you can override the get of myViewController

-(UIViewController*) myViewController {
    if(!_myViewController) {
        _myViewController = [[UIViewController alloc] init];
    }

    return _myViewController;
}

This way you guarantee that was only instantiated once and is always there when you needed.

ATTENTION

This works well if you always use self.myViewController. I consider a good practice that properties' generated iVars should only be accessed in their setters/getters.

OTHER TIPS

You can use the following way to ensure that only one instance of the view controller active at a time.

if(myViewController) {
  [myViewController release];
   myViewController = nil;
}

myViewController = [[ViewController alloc] init];  

[self presentViewController:myViewController animated:YES completion:NULL];

You need to make myViewController as class variable.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top