保留rootViewController?

时间:2010-08-25 11:39:25

标签: iphone objective-c cocoa-touch

我想知道是否有人可以在下面的代码中帮助我解决内存管理问题。我对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”吗?

非常感谢,非常感谢。

加里

2 个答案:

答案 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保留。