我想知道是否有人可以在下面的代码中帮助我解决内存管理问题。我对rootController特别感兴趣,当我执行initWithRootViewController时它会被保留还是代替它(这是我的猜测)保留了窗口addSubView:我只是好奇发生了什么......
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
Base_TableViewController *rootController = [[Base_TableViewController alloc] init];
navController = [[UINavigationController alloc] initWithRootViewController:rootController];
[window addSubview:[navController view]];
[window makeKeyAndVisible];
[rootController release];
return YES;
}
- (void)dealloc {
[navController release];
[window release];
[super dealloc];
}
基本上上面的代码是正确的,底部的发布会取消顶部的alloc,navController会保留“rootController”吗?
非常感谢,非常感谢。
加里
答案 0 :(得分:3)
在调用alloc init之后,rootController上的retain count将为1。如果navController在其中保留了initWithRootViewController消息,那么在该行之后,它将具有两个保留计数(我很确定UINavigationController将保留它的根视图控制器)。
将navController的视图添加到窗口不会影响rootController的保留计数(它将增加navController的UIView成员上的保留计数)。
rootController发布后,它会将保留计数减少到一个。
修改强>
是的。实际上,您可以通过删除底部的版本并在初始分配周围粘贴 autorelease 来稍微简化代码。
答案 1 :(得分:3)
initWithRootViewController:保留 rootController 。 addSubview:保留 navController.view
编辑: 是的,这是事实。并且[rootController release]实际上并不释放rootController,它只是将其保留计数减1,因为它已被initWithRootViewController保留。