проблема выпуска окна addSubview - PullRequest
3 голосов
/ 21 июля 2011

Мне было интересно кое-что о делегате приложения моего приложения. Почему я не могу выпустить так:

-(BOOL)application:(UIApplication *)application
  didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    RootViewController *controller = [[RootViewController alloc]
                                      initWithNibName:@"RootViewController"
                                               bundle:[NSBundle mainBundle]];
    [self.window addSubview:controller.view];
    [controller release]; // Here's my question
    [self.window makeKeyAndVisible];
    return YES;
}

Я был почти уверен, что -addSubview метод увеличится на 1 мой счет удержания. Так почему у меня происходит сбой при отпускании контроллера? Почему это работает в другом классе, кроме делегата?

Спасибо!

Ответы [ 5 ]

3 голосов
/ 21 июля 2011

Другие ответы верны, UIVIewController не сохраняется, я рекомендую установить свойство UIWindow rootViewController (доступно только для iOS 4.0 и более поздних версий), которое сохраняет контроллер. Если ваше приложение поддерживает предварительно iOS 4.0, вам нужно будет хранить контроллер в переменной экземпляра.

-(BOOL)application:(UIApplication *)application
  didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    RootViewController *controller = [[RootViewController alloc]
                                      initWithNibName:@"RootViewController"
                                               bundle:[NSBundle mainBundle]];
    //controller will be retained and view will set for you
    window.rootViewController = controller;
    [controller release];
    [self.window makeKeyAndVisible];
    return YES;
}
1 голос
/ 21 июля 2011

Эта строка

[self.window addSubview:controller.view];

увеличивает количество сохраняемых данных controller.view , а не controller.Вот почему

[controller release];

создает проблему.

Если это главное окно, вам не нужно беспокоиться об утечке памяти, потому что window активен длявсю жизнь программы, и вся память очищается, когда она заканчивается.

0 голосов
/ 21 июля 2011

Когда вы добавляете представление как подпредставление, тогда сохраняется представление , а не его контроллер.Поэтому, когда вы отпускаете контроллер, он освобождается, а его вид - нет.В результате при последующем просмотре попробуйте отправить сообщения на уже освобожденный контроллер, и приложение завершит работу.

0 голосов
/ 21 июля 2011

Это потому, что вы являетесь единственным владельцем этого контроллера.Вы просто добавляете его вид как подпредставление окна.Хотя вид сохраняется окном окна, контроллер - нет.

Таким образом, он будет освобожден, и любое его дальнейшее использование приведет к падению вашего приложения.

0 голосов
/ 21 июля 2011

addSubView увеличивает количество сохраняемых представлений внутри контроллера представления, поэтому приложение вылетает, если вы отпускаете контроллер.

в любом случае, если вы не отпускаете его, выбудет утечка.решение заключается в создании ивара в вашем классе и назначении ему контроллера представления (вместо локальной переменной), а затем освобождает его в dealloc.

...