2011-04-14 53 views
0

我有一個表視圖,只要點擊一行就會呈現UIViewController(顯示該特定行的詳細信息)。從表視圖呈現的UIViewController - 彈出時未被銷燬

的代碼如下:

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

{ 

if (!detail) { 

detail = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];   

} 

PlaceObject *info = [locationInfo objectAtIndex:indexPath.row]; 

detail.UniqueID = info.UniqueID; 
detail.hidesBottomBarWhenPushed = YES; 

[self.navigationController pushViewController:detail animated:YES]; 

self.detail = nil; 
[detail release]; 

} 

的問題是,「細節」不(當用戶返回到表視圖)似乎當從堆棧中彈出被破壞。

我在「細節」 UIViewController類的一些IBOutlets和可變的,我在的dealloc釋放如下:

- (void)dealloc 
{ 
NSLog(@"Deallocing"); 

[storedURL release]; 
[storedNumber release]; 
[storedLocation release]; 
[nameLabel release]; 
[postCode release]; 
[description release]; 
[openTime release]; 
[nearestTube release]; 
[area release]; 
[image release]; 
[name release]; 
[phoneNumber release]; 
[scroll release]; 
[picture release]; 
[addressOne release]; 
[cost release]; 

[super dealloc]; 

} 

任何人能勸爲什麼「細節」可以不被破壞用戶返回時到表格視圖?

編輯

好了上面的代碼,現在完美的作品。關鍵似乎是將細節設置爲零 - 不知道爲什麼。

回答

1

兩件事情:

  1. 你是分配/ init'ing,但不釋放它。這是一個問題。
  2. 您正在將其設置爲屬性(可能設置爲保留)。由於(1),這是一個問題。

因此,要解決這個問題,請在本地作用域(該方法的結尾)完成in之後釋放該對象。並且由於它是一個屬性,所以將它釋放到擁有的類的dealloc方法中。

+0

我在[detail release]中添加了方法的末尾,還有dealloc方法中的[detail release]。這個視圖現在被處理,但現在在「細節」對象的[super dealloc]中崩潰。爲什麼會發生這種情況? – GuybrushThreepwood 2011-04-14 20:40:05

+0

更新您的代碼上面。 – 2011-04-15 02:09:39

1

分配/初始化 - 保留計數:1

與屬性設置 - 保留計數:2

推到NAV。控制器 - 保留計數:3

彈出導航。控制器 - 保持數:2

這使得該屬性有保留標誌但無論哪種方式的假設,你的保留計數永遠不會得到0

+0

謝謝。現在正在釋放。然而,第二次點擊表格單元格時,應用程序現在因「不良訪問」而崩潰? – GuybrushThreepwood 2011-04-14 21:11:27

1

假設detail是保留的財產。重寫getter來做懶惰的實例化。

- (DetailViewController *)detail 
{ 
    if (!detail) 
    { 
     detail = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil]; 
     detail.hidesBottomBarWhenPushed = YES; 
    } 

    return detail; 
} 

另外要確保你只-dealloc發送-releasedetail。您的-tableView:didSelectRowAtIndexPath:現在看起來像這樣。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath  *)indexPath 
{ 
    detail.UniqueID = [locationInfo objectAtIndex:indexPath.row].UniqueID; 
    [self.navigationController pushViewController:self.detail animated:YES]; 
} 
+0

這會導致以下錯誤:detail.UniqueID = [locationInfo objectAtIndex:indexPath.row] .UniqueID; – GuybrushThreepwood 2011-04-15 09:31:53

+0

那個錯誤是...? – 2011-04-15 20:37:29

相關問題