程序在popToRootViewControllerAnimated之后崩溃

时间:2011-09-14 05:23:10

标签: iphone objective-c uinavigationcontroller exc-bad-access

我在MainMenuViewController类中有一个navigationController。当我在navigationController中推送FirstViewController时,我转到我的第二个场景(FirstViewController),它没问题。但是当我想要回到根控制器(MainMenuViewController)时,我的程序在main.m中崩溃并出现错误线程1:程序收到信号:“EXC_BAD_ACCESS”。你能救我吗?

int main(int argc, char *argv[]) {

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);  // CRASH
    [pool release]; 
    return retVal;
}

ProjectAppDelegate.h:

@interface ProjectAppDelegate: NSObject <UIApplicationDelegate> {
    UIWindow *window;
    MainMenuViewController *mainVC;
    UINavigationController *navigationController;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet MainMenuViewController *mainVC;
@property (nonatomic, retain) UINavigationController *navigationController;

+(ProjectAppDelegate.h*)getInstance;
@end

ProjectAppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    ProjectAppDelegateInstance = self;
    self.navigationController = [[UINavigationController alloc] initWithRootViewController:mainVC];
    [self.navigationController setNavigationBarHidden:TRUE];
    [self.window addSubview:self.navigationController.view];
    [self.window makeKeyAndVisible];
    return YES;
}

MainMenuViewController.m

- (IBAction)actonFirst:(id)sender 
{
    FirstViewController *firstVC = [[[FirstViewController alloc] initWithPageNum:1] autorelease];
    [[ProjectAppDelegate getInstance].mainVC.navigationController pushViewController:firstVC animated:TRUE];
}

FirstViewController.m

- (IBAction)actonHome:(id)sender 
{
    [[ProjectAppDelegate getInstance].mainVC.navigationController popToRootViewControllerAnimated:TRUE];
}

3 个答案:

答案 0 :(得分:2)

为什么要推送recipeVC来分配firstVC。

FirstViewController *firstVC = [[FirstViewController alloc] initWithPageNum:1];

[[ProjectAppDelegate getInstance].mainVC.navigationController 
pushViewController:recipeVC animated:TRUE];

答案 1 :(得分:1)

为什么要将您的app委托类命名为ProjectAppDelegate.h?删除“.h”。

@interface ProjectAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
    MainMenuViewController *mainVC;
    UINavigationController *navigationController;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet MainMenuViewController *mainVC;
@property (nonatomic, retain) UINavigationController *navigationController;

+(ProjectAppDelegate*)getInstance;
@end

另一个好的编码实践是手动释放firstVc而不是自动释放。这种方法要好得多。

- (IBAction)actonFirst:(id)sender 
{
    FirstViewController *firstVC = [[FirstViewController alloc] initWithPageNum:1];
    [[ProjectAppDelegate getInstance].mainVC.navigationController pushViewController:firstVC animated:TRUE];
    [firstVc release];
}

答案 2 :(得分:1)

actionFirst方法中的recipeVC是什么?先检查一下.. 我在我的一个项目中也遇到过这种问题。制作firstVC是MainMenuViewController&amp;在dealloc()中释放它。 尝试一下对我有用的。