这是为什么过度释放?的UINavigationController/UITableView的

问题描述:

我推着一个视图控制器到我的导航控制器的堆栈从我TableViewController的didSelectRowAtIndexPath方法方法中像这样:这是为什么过度释放?的UINavigationController/UITableView的

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]”,我们不会崩溃。

我无法进一步缩小这一点。 “超级”将是UIViewController类,我不能进一步调查dealoc方法......我可以吗?也许有一种方法可以看到0xd4f860究竟是指向了什么,但我不知道如何?有任何想法吗?

+0

您是否在任何地方发布myViewController.view? – 2009-07-22 19:40:26

您正在寻找错误的地方 - 问题是myViewController被释放(或自动释放)太多次。

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

你也可以重写释放方法,设置一个断点,看看你是否可以缩小它的方式......例如,

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

刚刚尝试覆盖释放方法,并在那里放置一个中断...它在调用21次(我假设由didSelectRowAtIndexPath触发),然后在退出视图时再调用8次左右。不知道我应该寻找什么...在那里的很多框架调用(“紫色”?!?等等) – Meltemi 2009-07-22 19:26:18