2011-12-04 50 views
0

在我的根視圖中,我有一個三行的tableview。當我點擊任一行時,它會顯示一個新的視圖,然後我可以按下由我的導航控制器自動創建的後退按鈕。當我嘗試點擊之前已經選擇的行時,出現問題。我收到一個EXC BAD ACCESS錯誤消息。我認爲這是neccessary所有代碼:我還很陌生內存管理通知

- (void)dealloc 
{ 
    self.rowChosenArray = nil; 
    self.rootChoicesArray = nil; 
    self.customImage = nil; 
    self.rootTableView = nil; 
    [super dealloc]; 
} 

- (void)viewDidLoad 
{ 

    [super viewDidLoad]; 

    self.rootChoicesArray = [[[NSMutableArray alloc] initWithObjects:@"",@"See Today's Deals!", @"My Purchased Deals", @"Personal Settings", nil] autorelease]; 

    self.rowChosenArray = [[[NSMutableArray alloc] initWithObjects:@"", nil] autorelease]; 

    DealsViewController *dealsViewController = [[DealsViewController alloc] initWithNibName:@"DealsViewController" bundle:nil]; 
    [self.rowChosenArray addObject:dealsViewController]; 
    [dealsViewController release]; 

    PurchasedDealsViewController *purchasedDealsViewController = [[PurchasedDealsViewController alloc] initWithNibName:@"PurchasedDealsViewController" bundle:nil]; 
    [self.rowChosenArray addObject:purchasedDealsViewController]; 
    [purchasedDealsViewController release]; 

    SettingsViewController *settingsViewController = [[SettingsViewController alloc] initWithNibName:@"SettingsViewController" bundle:nil]; 
    [self.rowChosenArray addObject:settingsViewController]; 
    [settingsViewController release]; 
} 

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
} 

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UIViewController *targetViewController = [rowChosenArray objectAtIndex: indexPath.row]; 
[[self navigationController] pushViewController:targetViewController animated:YES]; 
[targetViewController release]; 
} 

哪裏/何時釋放/設置對象爲零(所有四個我的對象已經在頭文件中保留財產

預先感謝您的幫助,讓我知道是否有其他任何你可能需要

回答

1
  1. 在添加元素到一個數組,你ALLOC,但釋放它,一旦它被添加 - 所以有是沒有泄漏;
  2. 你永遠不需要釋放數組中的元素,因爲它們將在您釋放數組本身時釋放。
1

你是過度釋放targetViewControllertableView:didSelectRowAtIndexPath:。您通過objectAtIndex:(這意味着您不對該參考負責)獲得非擁有參考,並且可能不會釋放該參考。所以只要刪除[targetViewController release];,一切都很好。

的規則是這樣的:你可能發佈一個參考,如果你要麼retain編它還是有它通過它的名稱的方法:

  • 是或alloccopymutableCopy
  • 開始
  • 開頭new
0

此外,你也有一些泄漏,如果你保留在viewDidLoad你應該發佈/無在viewDidUnloaddealloc