Многие люди говорят, что при использовании метода 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
?