为什么这个发布的视图控制器在发出消息时不会导致崩溃

时间:2009-10-22 17:16:33

标签: iphone objective-c memory-management

- (void)applicationDidFinishLaunching:(UIApplication *)application {

    // Create the navigation and view controllers
    RootViewController *rootViewController = [[RootViewController alloc]
                                              initWithStyle:UITableViewStylePlain];
    UINavigationController *aNavigationController = [[UINavigationController alloc]
                                             initWithRootViewController:rootViewController];
    self.navigationController = aNavigationController;
    [aNavigationController release];
    [rootViewController release];

    [rootViewController setRegions:[Region knownRegions]];

    // Configure and display the window
    [window addSubview:[navigationController view]];
    [window makeKeyAndVisible];
}

在上面的代码中,引用'rootViewController'用于发送消息'setRegions:',即使在上一行中释放了对象之后也是如此。

如果它错了那么模拟器如何运行而没有任何崩溃? 要么 如果它是正确的,又如何?,我看不出autorelease&释放。

消息来源: - http://developer.apple.com/iphone/library/samplecode/TableViewSuite/listing12.html

下载: - developer.apple.com/iphone/library/samplecode/TableViewSuite/index.html

1 个答案:

答案 0 :(得分:5)

rootViewController保留的对象由aNavigationController保留,因此其保留计数为2,并且aNavigationController在分配给self.navigationController时保留rootViewController,因此其保留计数为2.因此,当您发布aNavigationController和{{1}}时,其保留计数会降至1,因此不会收集它们,因此您仍然可以通过其引用访问它们。

修改

对象仅在其保留计数达到0时收集,并且对对象的任何引用仍然有效(即使引用已被释放),直到此时为止。通常情况下,您不希望依赖于此并且应该在释放对象之前进行调用,但在这种情况下它确实有效。