0

У меня есть обычная архитектура. С одним UIViewController и многими subview. Я использую UIView как viewController и UIViewController для анимации перехода.Dealloc не вызвал на subview с ARC

UIView с большим количеством подсмотров, которые я нажимаю на главное окно, я удаляю FromSuperview и все в порядке, но метод subview не вызывает dealloc. Также я пытаюсь очистить объекты

 
- (void) dealloc { 
    NSLog(@"ActivityShowVC dealloc"); 
    [showView removeFromSuperview]; 
    showView = nil; 
} 

Это называется.

 
- (void) dealloc { 
    NSLog(@"ActivityShowView dealloc"); 

    [mainScroll removeFromSuperview]; 

    [titleView setDelegate:nil]; 
    [titleView removeFromSuperview]; 
    titleView = nil; 

    [photoView setDelegate:nil]; 
    [photoView removeFromSuperview]; 
    photoView = nil; 

    [predictionView setDelegate:nil]; 
    [predictionView removeFromSuperview]; 
    predictionView = nil; 

    [calendarView setDelegate:nil]; 
    [calendarView removeFromSuperview]; 
    calendarView = nil; 

    [descriptionView setDelegate:nil]; 
    [descriptionView removeFromSuperview]; 
    descriptionView = nil; 
} 

Но у этого есть некоторые проблемы.

+0

Где вы определяете dealloc? – ldindu

+2

Насколько я знаю, вам не нужно беспокоиться о том, чтобы удалить subviews из супервизора в методе dealloc. Все наблюдения будут удалены и освобождены, когда ваш контроль будет освобожден. Просто оставьте делегат = нуль в методе dealloc. ARC должна заботиться обо всем остальном. – Greg

+0

Я решил. Проблема была в делетете, которая сохраняет мои взгляды! – outfoll

ответ

5

Если dealloc реализован и не вызван, то есть что-то, сохраняющее экземпляр. Вам нужно переосмыслить сильные ссылки на него.

Dealloc не является хорошим местом, чтобы делать что-либо кроме освобождения ресурсов, поскольку экземпляр больше не является полностью функциональным и не в полном состоянии. Делать такие вещи, как: [showView removeFromSuperview];, лучше всего делать явно до освобождения.

Как указано в @Greg, большинство или все то, что вы делаете в dealloc, не требуется в ARC. Подвижные объекты теперь обычно weak, поэтому явный dealloc не нужен. Фактически, они могут уже исчезнуть в зависимости от порядка срыва иерархии представлений.

+0

Я успешно использовал 'dealloc' для прерывания циклов сохранения в' UIViewController', но я наткнулся на цикл сохранения, который я решил, заменив 'dealloc'' removeFromSuperview'. Хотя название метода похоже на лучшее место для удаления ваших вещей, почему вы говорите, что это плохое место? А какое другое место подходит для 'UIViewController'? –

+0

Что это касается моего вопроса? Я не говорил, что я называю 'dealloc', просто переписываю его в' UIViewController', и он работает нормально. 'UIViewController' s, например, не имеет метода 'removeFromSuperview'. –

+0

Правда, но мне было непонятно, что означает «замена dealloc на removeFromSuperview». – zaph

2

Я решил аналогичную проблему. В моем Viewcontroller у меня создан указатель NSTimer, когда я помещаю код ниже в 'viewWillDisappear', вызывается 'dealloc'.

if (_timer) { 
     [_timer invalidate]; 
     _timer = nil; 
    } 
Смежные вопросы