使用Init,PushViewController,Release时出现奇怪的错误访问。这段代码有什么问题吗?

时间:2010-09-10 22:00:45

标签: iphone crash release init pushviewcontroller

也许我已经看了太久了;)我的应用程序有一个NavigationController和几个ViewControllers。从其中一个ViewControllers向下(mainViewController),从rootViewController加载,我有下面的代码。在PushViewController到dataViewController并返回后(例如按下后退按钮),应用程序崩溃。

dataViewController加载得很好,但是当点击navigationController的后退按钮时,应用程序崩溃并出现对象异常。如果我删除:

[dataViewController release];

该应用程序正常工作。这很奇怪,因为dataViewController是以相同的方法初始化的。 有什么想法吗?

- (void) locationPage 
{

    [[NSNotificationCenter defaultCenter] postNotificationName:@"NotifyRemoveMap" object:nil];
    MyAppDelegate *app = [[UIApplication sharedApplication] delegate];

    UINavigationController *navigation = app.navigationCantroller;
    [navigation popToRootViewControllerAnimated:NO];

    DataViewController *dataViewController = [[DataViewController alloc] initWithNibName:@"DataView" bundle:nil];
    [dataViewController setCategoryId:category];

    MyLanguage *lang = app.lang;
    Mylocation *location = [lang locationForCategoryId:category];

    dataViewController.title = location.name;
    NSArray *locationArray = [lang locations];

    dataViewController.locations = locationArray;
    [navigation pushViewController:dataViewController animated:YES];
    [dataViewController release]; //  With this removed, app doesn't crash
}

3 个答案:

答案 0 :(得分:2)

甚至没有看过你的帖子。如果它是Exec-Bad-Access,我有两个字给你:

启用NSZombies。

请点击此链接:(它解释了解决任何不良访问问题需要了解的所有内容)

Phone Memory Debug with NSZombie and Instruments

干杯!

答案 1 :(得分:1)

当dataViewController被弹出并且你试图访问它时它可能会出现问题 - 它已经被释放了。您可以检查控制台以获取更多详细信息 - 更好的是,在调试模式下运行(调试配置与调试器一起运行)。

您可以编辑问题以显示使用后退按钮运行的一些代码。

答案 2 :(得分:0)

您谈到发布dataViewController但您的代码说detailsViewController。您是否错误地复制和粘贴,或者是错误?

您应该考虑不使用app.navigationController,而是使用self.navigationController。更清洁的设计。对应用程序委托的依赖性较小,这通常被用作非常了解的frankensteinobject。