UIViewController从表视图中显示 - 弹出时不被破坏

时间:2011-04-14 18:26:12

标签: iphone objective-c memory-management sdk 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和Variable,我在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];

}

有人可以告知当用户返回表格视图时为什么“细节”不会被销毁?

修改

好的,上面的代码现在完美无缺。关键似乎是将细节设置为零 - 虽然不确定原因。

3 个答案:

答案 0 :(得分:1)

夫妻俩:

  1. 你是分配/初始化它但不释放它。那是个问题。
  2. 您正在将其设置为属性(可能设置为保留)。这是一个问题,因为(1)。
  3. 因此,要解决此问题,请在完成本地范围(该方法结束)之后释放该对象。因为它是一个属性,所以在拥有类的dealloc方法中释放它。

答案 1 :(得分:1)

alloc / init - 保留计数:1

使用属性设置 - 保留计数:2

推进导航。控制器 - 保留计数:3

弹出导航。控制器 - 保留计数:2

这假设该属性具有保留标志,但无论如何,您的保留计数永远不会达到0

答案 2 :(得分:1)

假设detail是保留属性。重写getter以进行延迟实例化。

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

    return detail;
}

另外请确保您仅在-releasedetail发送-dealloc。您的-tableView:didSelectRowAtIndexPath:现在看起来像这样。

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