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

我在进一步缩小范围方面遇到麻烦。 “超级”将是UIViewController类,我无法进一步研究该Dealoc方法...可以吗?也许有一种方法可以确切地看到0xd4f860指向什么,但我不知道该怎么做?有任何想法吗?

最佳答案

您在错误的位置查找-问题是myViewController被释放(或自动释放)的次数过多。

您发布的代码看起来正确,因此,我将查看MyViewController的代码以查看其是否自行发布,或以某种方式使其自身通过其他方式发布。

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

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

07-27 13:26