开发者

Releasing UIViewController when not in use

Hi I hope somebody can help me with this problem.

I have a UIViewController named "Login" (for example) and when the user has successfully logged in this will call another controller to replace the "Login" controller like below:

[self presentModalViewController:anotherController animated:YES]. 

I do not need the previous controller any more so I placed a [self release] as shown in the code snippet below.

LoginController.m

- (void)viewDidDisappear:(BOOL)animated {
    [self release];
}

This wi开发者_如何学Pythonll then call the LoginController's dealloc method and I can be sure it's released.

Now in the new controller that is now in view has a button which calls a UINavigationController like below:

[self presentModalViewController:settingsNavigationController animated:YES];

But this crashes the app which would normally work if I didn't release the previous LoginController.

There is probably an easier or more logical method to release the controller but as I am running out of ideas I sometimes use drastic measures.

Thank you.


You should not be releasing the LoginController, at least not in its own -viewDidDisappear:. That controller is still in use and can be referenced, for example by the navigation controller's parentViewController property. Release the controller when it is no longer part of your view controller hierarchy, not just when it is no longer visible.

In addition [self release] is a warning sign that you are applying incorrect memory management.


1) Replace the "Login" controller

presentModalViewController doesn't replace your login view controller, but it puts anotherController on top of your login view controller.

2) viewDidDisappear

You should read documentation. Quote - You can override this method to perform additional tasks associated with dismissing or hiding the view. If you override this method, you must call super at some point in your implementation.

In other words, you must call [super viewDidDisappear:animated] too.

3) Memory Management

You should definitely need to read Memory Management Guide - http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/MemoryMgmt/MemoryMgmt.html

4) View Controller

You should definitely need to read View Controller Programming Guide too - http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html


Two problems with what you are doing.

First, viewDidDisappear is NOT a destructor. Do not release self there. viewDidDisAppear and appear are used for visibility of the view, not in/out of memory.

Second, presentModalViewController is intended for presenting a MODAL view controller, ie child.

You should consider setting up a UINavigationController and calling

[navigationController popToRootViewControllerAnimated:FALSE];   
[navigationController pushViewController:(UIViewController*)controller animated:TRUE];      

also in some situations you can get away with an [autorelease] view controller using present modal.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜