不使用xib时,在内存警告后不调用-viewDidUnload

时间:2012-09-12 12:25:59

标签: iphone ios

当我使用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

1 个答案:

答案 0 :(得分:2)

如果您使用UIViewContoller而未从NIB初始化它,则需要继承-loadView方法。否则,iOS会假定无法卸载/重新加载视图。

将以下内容添加到您的实现中就足够了:

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

不幸的是documentation对此并不十分清楚。