2014-04-30 3 views
5

В iOS я выхожу из текущего viewController в предыдущий, но он не переходит в dealloc.iOS - метод viewController dealloc, который не вызывается после всплытия на предыдущий viewController

Это потому, что есть другой указатель, указывающий на текущий viewController, либо в другом viewController, либо в текущем?

Это где я выскочить к предыдущему виду:

- (IBAction)fileUploadCancelTouched:(UIButton *)sender { 

    [self.fileToUpload cancel]; 

    [self.view hideToastActivity]; 
    [self.greenprogressBar removeFromSuperview]; 
    [self.subView removeFromSuperview]; 
    self.fileUploadCancelButton.hidden = YES; 
    if (self.commandComeBackToFinalScreen == 1) { 
     [self.navigationController popViewControllerAnimated:YES]; 
    } 
} 

Это моя dealloc функция:

- (void)dealloc { 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 

    self.greenprogressBar = nil; 
    self.fileUploadCancelButton = nil; 
    self.fileToUpload = nil; 
    [buttonHome_ release]; 
    [buttonTestMeAgain_ release]; 
    [buttonMarkMyTest_ release]; 
    [examId_ release]; 
    [sender_ release]; 
    self.ob = nil; 
    [_fileUploadCancelButton release]; 
    [super dealloc]; 
} 
+0

Просьба указать код для лучшего понимания вашего вопроса. –

ответ

6

Проверьте, чтобы убедиться, что ARC не включен в вашем проекте. Если он не поддерживает ARC, тогда вызывается dealloc, если ваш код не сохранит ваш контроллер просмотра. Вы должны проверить через Instruments tool, если ваши поп-команды уменьшают память или нет.

Возможно, есть еще несколько причин, упомянутых в другом ответе, который я размещаю ниже: Очевидная причина в том, что что-то сохраняет ваш viewController. Вам нужно будет внимательно изучить ваш код. Выполняете ли вы что-либо, что в вашем классе, которое использует делегатов, поскольку они иногда сохраняют делегат. NSURLConnection сохранит ваш класс, а также NSTimer. Вы можете разбрасывать код в своем классе и регистрировать счетчик своего класса и пытаться выяснить, где. В коде, который вы показывали до сих пор, сохранение может быть только 1, так как класс сохраняется только навигационным контроллером.

Кроме того, перед тем, как вы откроете свое представление, получите ссылку на него, поместите его без анимации NO, а затем отправьте ему сообщение, в котором он будет сообщать счет сохранения (это будет какой-то новый метод, который вы пишете). Этот новый метод может также записывать другие вещи, например, есть ли у него какие-либо таймеры, NSURLConnections и т. Д.

+0

'[NSTimer scheduleTimerWithTimeInterval: 12 target: self selector: @selector (sendTest) userInfo: nil repeatats: NO];' будет ли это сохранять viewController? и если да, исправит ли это функция 'invalidate'? – Operative

+1

@Khawar Ali, пожалуйста, не рекомендуется, чтобы люди использовали '-retainCount': http://whentouseretaincount.com. –

+1

@Operative yes, недействительный таймер освободит свою цель. Из документации по этому методу таймера: 'Таймер поддерживает сильную ссылку на цель, пока она (таймер) не будет признана недействительной.'. –

1

Прежде всего, избавитесь от [super dealloc]. Я знаю, что это интуитивно, но документация говорит, что не делайте этого.

В моем случае у меня был наблюдатель & таймер в моем методе dealloc, но это не сработало, поскольку таймер имел сильный указатель на контроллер.

Создал специальный метод очистки, который удалил наблюдателя &, признал недействительным таймер. После этого контроллер был правильно освобожден.

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