2012-09-13 79 views
1

我有一個相當不尋常的情況,我不完全理解內存管理。何時從UITableViewController創建時釋放UINavigationController?

我有一個UITableViewController用於顯示消息,然後創建一個UINavigationController並將其視圖添加爲當前視圖的子視圖以顯示它。我遇到的問題是,由於沒有發佈UINavigationController,Xcode報告我有潛在的內存泄漏(我同意),但是當我在下面的代碼中釋放它時,應用程序會崩潰,當我點擊返回到表視圖。

我在UITableViewController中使用了一個保留屬性來跟蹤當前的UINavigationController並管理保留計數,但顯然我在這裏丟失了一些東西。

注:後退按鈕被點擊有消息時發生崩潰 - [UILayoutContainerView removeFromSuperview:]:無法識別的選擇發送到實例0x5537db0

還要注意的是,如果我刪除[NC發佈]的代碼行,它工作得很好。

這裏是我的代碼:

@property(nonatomic, retain) UINavigationController *currentNavigationController; 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UINavigationController *nc = [[UINavigationController alloc] init]; 

    CGRect ncFrame = CGRectMake(0.0, 0.0, [[self view] frame].size.width, [[self view] frame].size.height); 
    [[nc view] setFrame:ncFrame]; 

    // I created a CurrentNavigationController property to 
    // manage the retain counts for me 
    [self setCurrentNavigationController:nc]; 

    [[self view] addSubview:[nc view]]; 
    [nc pushViewController:messageDetailViewController animated:YES]; 


    UIBarButtonItem *bbi = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonSystemItemRewind target:[nc view] action:@selector(removeFromSuperview:)]; 


    nc.navigationBar.topItem.leftBarButtonItem = bbi; 
    [bbi release]; 

    [nc release]; 
} 

回答

1

UINavigationController的 「NC」 您所創建的僅僅是這種方法中使用。這個方法之後沒有任何地方存儲(因爲你釋放它)。因此,您將navigationController的視圖添加到您的類視圖中作爲子視圖,然後刪除navigationController。這是錯誤的。當視圖和viewControllers試圖引用他們的navigationController(當它不存在時),你的應用程序將崩潰。

這裏是didSelectRowForIndexPath方法代碼:到底:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    UINavigationController *nc = [[UINavigationController alloc] init]; 

    CGRect ncFrame = CGRectMake(0.0, 0.0, [[self view] frame].size.width, [[self view] frame].size.height); 
    [[nc view] setFrame:ncFrame]; 

    [self setCurrentNavigationController:nc]; 
    [nc release]; 

    [[self view] addSubview:[self.currentNavigationController view]]; 

    UIViewController *viewCont = [[UIViewController alloc] init]; 
    [viewCont.view setBackgroundColor:[UIColor greenColor]]; 

    [nc pushViewController:viewCont animated:YES]; 

    NSLog(@"CLASS %@",[[self.currentNavigationController view]class]); 

    UIBarButtonItem *bbi = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonSystemItemRewind target:[self.currentNavigationController view] action:@selector(removeFromSuperview)]; 


    self.currentNavigationController.navigationBar.topItem.leftBarButtonItem = bbi; 
    [bbi release]; 
} 

選擇了removeFromSuperview方法不應該有 「」。它沒有參數:)

+0

首先沒有注意到你的財產......我想,應用程序崩潰,因爲創建新的navigationControllers。當您將其分配給您的財產時,舊的被刪除,並且所有的視圖都被取消了... –

+0

我編輯了我的代碼,以顯示如何在單擊後退按鈕時彈出視圖。在添加新的導航控制器時,視圖應該全部消失。不過,值得注意的是,點擊後退按鈕後應用程序崩潰。 – jwoww

+0

找到解決方案。去編輯答案並添加代碼。 –

相關問題