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

Mel*_*emi 10 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];
Run Code Online (Sandbox Code Playgroud)

如果我取消注释最后一行,那么应用程序在返回时崩溃并出现错误:

-[CALayer release]: message sent to deallocated instance 0xd4f860
Run Code Online (Sandbox Code Playgroud)

进一步挖掘我发现崩溃可以进一步缩小到MyViewController的dealoc方法中对[super dealoc]的调用.通过取消注释"[super dealoc]",我们不会崩溃.

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

Dan*_*son 4

你找错了地方——问题是 myViewController 被释放(或自动释放)的次数太多了。

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

您还可以覆盖释放方法,设置断点,看看是否可以通过这种方式缩小范围......例如

- (void)release {
    [super release]; //Set breakpoint here
}
Run Code Online (Sandbox Code Playgroud)