为什么这个过度释放? UINavigationController / UITableview

时间:2009-07-22 18:52:37

标签: iphone cocoa-touch uitableview uiviewcontroller uinavigationcontroller

我正在从我的TableViewController的didSelectRowAtIndexPath方法中将视图控制器推到我的导航控制器堆栈中,如下所示:

MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
MyObject *myO = (MyObject *)[appDelegate.myOs objectAtIndex:indexPath.row];
myViewController.amount = myO.amount;
[self.navigationController pushViewController:myViewController animated:YES];
[myViewController release];

如果我取消注释最后一行,则应用程序在返回时崩溃并显示错误:

-[CALayer release]: message sent to deallocated instance 0xd4f860

进一步深入研究我发现崩溃可以进一步缩小到MyViewController的dealoc方法中对[super dealoc]的调用。通过取消注释“[super dealoc]”,我们不会崩溃。

我无法进一步缩小范围。 “super”将是UIViewController类,我无法进一步研究这种处理方法......我可以吗?也许有办法看看0xd4f860到底指的是什么,但我不知道怎么回事?有什么想法吗?

1 个答案:

答案 0 :(得分:4)

你看错了地方 - 问题是myViewController被释放(或自动释放)太多次了。

您发布的代码看起来是正确的,所以我会查看MyViewController的代码,看看它是否会自行释放,或以某种方式通过其他方式释放自己。

你也可以覆盖释放方法,设置一个断点,看看你是否可以缩小它...例如。

- (void)release {
    [super release]; //Set breakpoint here
}