- (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
答案 0 :(得分:5)
rootViewController
保留的对象由aNavigationController
保留,因此其保留计数为2,并且aNavigationController
在分配给self.navigationController
时保留rootViewController
,因此其保留计数为2.因此,当您发布aNavigationController
和{{1}}时,其保留计数会降至1,因此不会收集它们,因此您仍然可以通过其引用访问它们。
修改强>
对象仅在其保留计数达到0时收集,并且对对象的任何引用仍然有效(即使引用已被释放),直到此时为止。通常情况下,您不希望依赖于此并且应该在释放对象之前进行调用,但在这种情况下它确实有效。