2011-06-17 92 views
0

我在xcode4中運行儀器,它告訴我在下面的代碼中有兩處泄漏(由****記錄)。我以爲我在代碼處理了內存釋放的問題。 A和pt。 B.如何解決pushViewController周圍的內存泄漏問題?

我在這裏通讀了一些相關的主題,但仍然無法弄清楚爲什麼以及如何解決它們。

另一個問題是,是否在pt發佈。 A是必要的。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    //Get the dialog id 
    NSDictionary *rowData = [dialogs objectAtIndex:indexPath.row]; 
    NSInteger dialogId = [[rowData objectForKey:@"id"] intValue]; 

    DialogViewController *detailViewController = [[DialogViewController alloc] initWithNibName:@"DialogViewController" bundle:nil]; 
    detailViewController.dialogId = dialogId; 
    NSString *title = [NSString stringWithFormat:@"%d. %@", [[rowData objectForKey:@"id"] intValue], [rowData objectForKey:@"title"]]; 
       ****** i  6.8% 
    [detailViewController.dialogTitle release];    // pt. A 
    detailViewController.dialogTitle = [title retain]; 

    [self.navigationController pushViewController:detailViewController animated:YES]; 
       ****** i 93.2% 
    [detailViewController release];       // pt. B 

} 

非常感謝! 魯

回答

1

是否釋放/保持通話是必要的A點取決於關於如何定義dialogTitle屬性。

如果將其定義爲@property(retain),則不需要釋放舊值或保留新值,因爲將值分配給(retain)屬性時會自動保留該值。另外,當您爲(保留​​)屬性分配新值時,舊值將被釋放,因此您不必執行釋放。所有你需要在這種情況下是:

detailViewController.dialogTitle = title; 

如果定義爲DIALOGTITLE(分配),那麼你需要做釋放/保留在A點

至於B點,你就需要在那裏釋放,因爲如果你不這樣做,你的detailViewController對象將永遠不會被刪除。當它被alloc/inited時,它的保留計數爲1.當你推動視圖控制器時,它被保留(所以現在保留計數爲2)。然後,在方法結束時釋放,並且它的保留計數降爲1.然後,當包含它的導航控制器被解除時,它將再次釋放,它的保留計數將變爲0,並且它將被刪除。

作爲在方法結束時釋放detailViewController的替代方法,您可以在分配/初始化它時自動釋放它,並在方法結束時刪除釋放。通過自動釋放它,你基本上將它標記爲在下一次自動釋放池被清除時自動釋放(這將在該方法退出後很快)

+0

rekle,謝謝你的回答!那麼你知道爲什麼Xcode4的泄漏工具將pt.B標記爲泄漏嗎?我應該把它作爲一個假陰性還是有可能是DialogViewController泄漏?你會建議什麼? –

0

的pushViewController上面的線應該是

detailViewController.dialogTitle = [[title retain] autorelease]; 

這應該工作,以及如果dialagTitle是保留財產

detailViewController.dialogTitle = title;