почему мой UIViewController сохраняется дополнительное время при использовании initWithNibName? - PullRequest
1 голос
/ 03 октября 2011

Я работаю над приложением, у которого есть главное представление, которое хочет порождать дочернее представление при нажатии кнопки.Поэтому, когда я получаю событие кнопки, MainViewController порождает дочернее представление, вызывая initWithNibName и сохраняя ChildViewController в ivar.Затем я показываю ChildView, прикрепляя анимацию и устанавливая childVC.view.hidden = NO.

. Это работает, но я заметил, что ChildViewController никогда не выпускался после закрытия ChildView.Я понял, что счетчик сохранения ChildVC изменился с 1 до 2, когда я впервые получаю доступ к дочернему виду.Таким образом, что-то в кишках загрузки пера снова сохраняет мой ChildVC (в дополнение к первоначальному сохранению, которое я ожидаю во время инициализации объекта).

Может кто-нибудь помочь мне выяснить, почему ChildVC получает дополнительное времяи как я могу убедиться, что он полностью освобождается, когда я хочу закрыть дочернее представление?

Редактировать: вот некоторый код, только слегка упрощенный.Это методы родительского контроллера представления.

-(IBAction)onLaunchChildButtonTouched:(id)sender
{
    m_childViewController = [[ChildViewController alloc] initWithNibName:@"ChildViewController" bundle:nil];
    [m_childViewController setParentDelegate:self];  // this is a weak reference

    // m_childViewController retain count here is 1, as expected
    m_childViewController.view.hidden = YES;
    // m_childViewController retain count is now 2, not expected

    [self.view addSubview:m_childViewController.view];

    [self addTransitionEntrDir:YES];  // code omitted

    m_childViewController.view.hidden = NO;

}


-(void)onChildWantsToClose:(id)child
{
    NSAssert( child == m_childViewController, @"unexpected childVC" );

    // if child view is now hidden, we should remove it.
    if( m_childViewController != nil && m_childViewController.view.hidden )
    {
        [m_childViewController.view removeFromSuperview];
        [m_childViewController release]; m_childViewController = nil;

        // BUG: m_childViewController retain count is still 1 here, so it never gets released

    }
}

Ответы [ 2 ]

0 голосов
/ 04 октября 2011

Я обнаружил проблему, дырявый ChildViewController создавал экземпляр объекта, который сохранил ссылку на него.

Интересно то, что я не просто забыл выпустить эту ссылку. У меня был вызов, чтобы освободить его, но этот код никогда не работал, потому что предполагалось, что viewDidUnload запустится и даст мне возможность освободить все, но это не так. Вместо этого я поместил свой deinit-код в dealloc, и теперь он работает.

0 голосов
/ 03 октября 2011

Без кода трудно сказать точно, но вы уверены, что не присваиваете ChildVC свойству retain какого-либо другого объекта? Это объяснило бы неожиданное retain, которое вы видите.

Извините за предыдущий ответ, где я пытался передать это же сообщение, но я все перепутал.

СТАРЫЙ ОТВЕТ: имейте в виду, что свойство view для UIViewController сохраняется: просмотр

Представление, которым управляет контроллер.

@property (nonatomic, retain) UIView * view Итак, если вы назначите ему так: childVC.view = [[xxxxx alloc] initWithNibName: ...]; это объясняет, что вы видите. Вместо этого используйте: childVC.view = [[[xxxxx alloc] initWithNibName: ...] autorelease];

...