3

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
4

1 に答える 1

2

NIBから初期化せずに使用している場合はUIViewContoller、メソッドをサブクラス化する必要があります-loadView。それ以外の場合、iOSはビューをアンロード/リロードできないと想定します。

実装に以下を追加するだけで十分です。

- (void)loadView {
    [super loadView];
    self.view = yourCreatedView;
}

残念ながら、ドキュメントはこれについてあまり明確ではありません。

于 2012-09-12T13:05:50.437 に答える