我有一个表视图,只要点击一行就显示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];
}
有人可以告知当用户返回表格视图时为什么“细节”不会被销毁?
修改
好的,上面的代码现在完美无缺。关键似乎是将细节设置为零 - 虽然不确定原因。
答案 0 :(得分:1)
夫妻俩:
因此,要解决此问题,请在完成本地范围(该方法结束)之后释放该对象。因为它是一个属性,所以在拥有类的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;
}
另外请确保您仅在-release
向detail
发送-dealloc
。您的-tableView:didSelectRowAtIndexPath:
现在看起来像这样。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
detail.UniqueID = [locationInfo objectAtIndex:indexPath.row].UniqueID;
[self.navigationController pushViewController:self.detail animated:YES];
}