2012-05-22 4 views
0

Я искал это на сайте Apple и могу только найти документацию с помощью раскадровки или навигационных контроллеров, ни один из которых я использую. Это невероятно простой вопрос об управлении памятью.Освобождение Main View Controller (iOS)

Я создал совершенно пустое приложение. В моей функции appFinishLaunchingWithOptions в AppDelegate я создаю экземпляр контроллера View, который я создал. Мой дизайн (который сам по себе может быть проблемой) заключается в том, чтобы иметь связь 1: 1 между View Controllers и Views.

Таким образом, главное меню моего приложения, которое является стартовой площадкой для всего, находится в MenuViewController.h/m.

В .h:

MenuViewController *m; 

В .m:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 
    // Override point for customization after application launch. 
    self.window.backgroundColor = [UIColor whiteColor]; 
    [self.window makeKeyAndVisible]; 

    m = (MenuViewController *)[[MenuViewController alloc] init]; 
    m.window = self.window; 
    [m doStuff]; // handful of functions, not actually called this 
    //[m release]; // doesn't make sense to me 
    return YES; 
} 

Это где я запутался. Я хочу, чтобы это существовало в основном для всего жизненного цикла приложения. Но у меня также создается впечатление, что вы должны (в рамках текущей функции) выпускать все, что вы выделяете. Если вам это нужно, вы должны сохранить его в другом месте. Разве это не так?

Мой основной вопрос: где я должен выпускать этот контроллер просмотра? Есть ли что-то еще, что я сказал, что кажется из-за удара?

+0

Почему вы не использовали автоматический подсчет ссылок? (Возможно, вы могли бы выпустить его в 'applicationWillTerminate: application' из AppDelegate) – Chris

+0

Вы отпустите его, прежде чем переходить к следующему виду. Вы также можете сделать это в методе viewDidUnload или dealloc – anuragbh

ответ

2

Инициализация неверна. Вы не назначаете окно контроллеру, вы назначаете контроллер на окно:

// window creation code here 
    ... 
    m = [[MenuViewController alloc] init]; 
    [window setRootViewController:m]; // window does retain for m 
    [m release]; // so we release it here 
    [self.window makeKeyAndVisible]; 
    return YES 
} 
+0

RootViewController для меня подразумевает одно. Неправильно ли/плохой дизайн иметь контроллер просмотра для каждого «экрана» в моем приложении? В настоящее время у меня есть один для главного меню, экран загрузки, экран для создания пользователей, экран для управления другими данными и т. Д. – JamesB41

+0

Именно так вы должны это делать. Конечно, в некоторых случаях разумнее использовать подкласс класса просмотра более одного раза, но для экранов, которые очень отличаются по своей природе и функции, у вас обычно есть отдельный подкласс контроллера представления. – DrummerB

+0

@ JamesB41, поэтому большинство приложений имеют контроллеры на панели управления или контроллеры навигации, которые позволяют отображать несколько контроллеров представления или иметь развернутую навигацию. – Eimantas

0

Вы правы. Как правило, вы должны выпускать все, что вы создаете в области. Но в этом случае вы хотите владеть контроллером представления. В этом случае вам нужно освободить объект в dealloc метод вашего приложения делегат:

- (void)dealloc { 
    [m release]; 
    [super dealloc]; 
} 

В качестве альтернативы вы можете определить @property для контроллера представления с сохранить флаг, а затем сделать это:

MenuViewController *viewController = [[MenuViewController alloc] init]; 
self.m = viewController; 
[viewController release]; 

Btw, вам не нужно бросать в MenuViewController в любом случае.

EDIT: Я полностью пропустил, что вы не добавляете свой контроллер вида в свое окно. Хорошая точка @ Эймантас.

+0

Мне нужно было только бросить его, потому что после этого я вызываю метод из AppDelegate, и он бросает предупреждение. – JamesB41

+0

Вы импортировали заголовок своего контроллера представления в своем делете приложения? Если ваша переменная (m) имеет тип MenuViewController (который соответствует вашему сообщению), и значение, которое вы передаете ему, имеет тот же тип, тогда вам не нужно делать бросок. У этого предупреждения была другая причина. – DrummerB

Смежные вопросы