В контроллере представления необходимо ли вызывать removeFromSuperview в подпредставлениях во время viewDidUnload?

Многие люди говорят, что при использовании метода viewDidUnload контроллера представления вы должны удалить подпредставления, вызвав метод removeFromSuperview . Например, Three20 делает что-то вроде этого:

- (void)viewDidUnload {
  [super viewDidUnload];
  ... snipped ...
  [_tableBannerView removeFromSuperview];
  TT_RELEASE_SAFELY(_tableBannerView);
  [_tableOverlayView removeFromSuperview];
  TT_RELEASE_SAFELY(_tableOverlayView);
  ... snipped ...
}

Я понимаю причины этого убеждения: если вы вызываете [self.view addSubview: _aView] в loadView , вы должны позвонить [_ aView removeFromSuperview] в viewDidUnload . Дело в том, что в этом нет необходимости. Когда представление контроллера представления освобождается, его метод dealloc автоматически освобождает все его подпредставления. Мой тестовый код показывает, что подпредставления автоматически освобождаются, когда выпускается их суперпредставление:

@interface TestView : UIView
@end

@implementation TestView
- (id)retain {
    NSLog(@"view retain");
    return [super retain];
}
- (void)release {
    NSLog(@"view release");
    [super release];
}
- (id)init {
    NSLog(@"view init");
    return (self = [super init]);
}
- (void)dealloc {
    NSLog(@"view dealloc");
    [super dealloc];
}
@end

@interface TestViewController : UINavigationController
@end

@implementation TestViewController
- (void)loadView {
    NSLog(@"viewController loadView");
    [super loadView];
    [self.view addSubview:[[TestView new] autorelease]];
}
- (void)viewDidUnload {
    NSLog(@"viewController viewDidUnload");
    [super viewDidUnload];
}
- (void)viewDidAppear:(BOOL)animated {
    NSLog(@"viewDidAppear");
    [super viewDidAppear:animated];
    [self dismissModalViewControllerAnimated:YES];
}
- (void)dealloc {
    NSLog(@"viewController dealloc");
    [super dealloc];
}
@end

Приведенный выше код производит следующий вывод:

viewController loadView
view init
view retain
view release
viewDidAppear
viewController dealloc
view release
view dealloc

Как вы можете видеть, когда выпускается основное представление контроллера представления, его подвиды также освобождаются. ] Кроме того, в библиотеке разработчика iOS [говорится] (http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/BasicViewControllers/BasicViewControllers.html#//apple_ref/doc/uid/TP40007457-CH101-SW4 ): «В случае нехватки памяти поведение UIViewController по умолчанию заключается в освобождении объекта представления, хранящегося в свойстве представления, если это представление в настоящее время не используется». Также: «Если вы используете объявленное свойство для хранения ссылки на ваше представление, и это свойство использует семантику сохранения, присвоение ему значения nil достаточно, чтобы освободить представление».

Таким образом, если освобождение представления автоматически освобождает его subview, действительно ли необходимо вызывать removeFromSuperview во время viewDidUnload ?

8
задан David H 10 June 2011 в 09:06
поделиться