xibを使用すると、メモリ警告の後に-viewDidUnloadが呼び出されます。
しかし、xibを使用する代わりにプログラムでビューを作成すると、-viewDidUnloadが呼び出されません。
(どちらの場合も、-didReceiveMemoryWarningが呼び出されます。)
xibファイルを使用しないのに-viewDidUnloadが呼び出されないのはなぜですか?
xibを使用しない場合、-viewDidUnloadのコードを記述する必要はありませんか?
以下はテストコードと結果です:(
私はARCを使用しています)
@implementation ViewControllerA
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = [NSString stringWithFormat:@"%d", gNavigationController.viewControllers.count];
// button to pop view controller to navigation controller
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame = CGRectMake(100, 100, 200, 50);
[button setTitle:@"push" forState:UIControlStateNormal];
[button addTarget:self action:@selector(push) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
// button to generate memory warning
button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame = CGRectMake(100, 200, 200, 50);
[button setTitle:@"memory warning" forState:UIControlStateNormal];
[button addTarget:self action:@selector(generateMemoryWarning) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
NSLog(@"view did load %@", self.title);
}
- (void)generateMemoryWarning {
[[UIApplication sharedApplication] performSelector:@selector(_performMemoryWarning)];
}
- (void)push {
UIViewController *viewController = [[ViewControllerA alloc] init];
[gNavigationController pushViewController:viewController animated:YES];
}
- (void)viewDidUnload
{
[super viewDidUnload];
NSLog(@"view did unload %@", self.title);
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
NSLog(@"view did receive memory warning %@", self.title);
}
@end
結果
ViewControllerAにxibがない場合:
view did load 1
view did load 2
view did receive memory warning 1
view did receive memory warning 2
ViewControllerAにxibがある場合:
view did load 1
view did load 2
view did unload 1
view did receive memory warning 1
view did receive memory warning 2