2011-04-14 52 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