使用iPhone SDK UINavigationController执行错误访问

使用iPhone SDK UINavigationController执行错误访问,iphone,xcode,sdk,uinavigationcontroller,exc-bad-access,Iphone,Xcode,Sdk,Uinavigationcontroller,Exc Bad Access,好的,我试着在Xcode中使用一个简单的UINavigationController和iPhone SDK,它在推送时工作得很好,但是如果超过2次推送并尝试弹出视图控制器,我会不断得到错误:EXC_BAD_ACCESS 我知道这意味着什么,但我该怎么解决呢 这是我的密码。。。(假设MainViewController具有调用函数showStartMenu的按钮) furbalappdelegate.h // //furbalappdelegate.h //Furball // //由摩根家族于2

好的,我试着在Xcode中使用一个简单的UINavigationController和iPhone SDK,它在推送时工作得很好,但是如果超过2次推送并尝试弹出视图控制器,我会不断得到错误:EXC_BAD_ACCESS

我知道这意味着什么,但我该怎么解决呢

这是我的密码。。。(假设MainViewController具有调用函数showStartMenu的按钮)

furbalappdelegate.h // //furbalappdelegate.h //Furball // //由摩根家族于2010年7月28日创建。 //版权所有2010年。版权所有。 // #进口 @类MainViewController、StartViewController、SubjectViewController; @接口代理:NSObject{ UIWindow*窗口; UINavigationController*导航控制器; 主视图控制器*主控制器; StartViewController*startController; } @属性(非原子,保留)UIWindow*window; @属性(非原子,保留)UINavigationController*navController; @属性(非原子,保留)MainViewController*mainController; @属性(非原子,保留)StartViewController*startController; -(无效)大力水手; -(void)下一步:(UIViewController*)下一步; -(无效)showStartMenu; @结束 furbalappdelegate.m // //furbalappdelegate.m //Furball // //由摩根家族于2010年7月28日创建。 //版权所有2010年。版权所有。 // #导入“FurballAppDelegate.h” #导入“MainViewController.h” #导入“StartViewController.h” #导入“SubjectViewController.h” @应用程序代理的实现 @合成窗口; @综合导航控制器; @综合主控制器; @合成星控器; -(无效)应用程序IDFinishLaunching:(UIApplication*)应用程序{ 窗口=[[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]边界]]; mainController=[[MainViewController alloc]init]; navController=[[UINavigationController alloc]initWithRootViewController:mainController]; [窗口添加子视图:navController.view]; [WindowMakeKeyandVisible]; } -(无效)解除锁定{ [主控制器释放]; [启动控制器释放]; [主题控制器释放]; [窗口释放]; [super dealoc]; } -(无效)大力水手{ [导航控制器PopViewControllerInitiated:是]; } -(无效)下一步:(UIViewController*)下一步{ [导航控制器pushViewController:下一个动画:是]; } -(无效)showStartMenu{ startController=[[StartViewController alloc]init]; [自推下一步:startController]; } @结束 StartViewController.h // //StartViewController.h //Furball // //摩根家族于2010年8月4日创建。 //版权所有2010年uu MyCompanyName uuu。版权所有。 // #进口 @接口StartViewController:UIViewController{ } -(作废)显示主题菜单; @结束 StartViewController.m // //StartViewController.m //Furball // //摩根家族于2010年8月4日创建。 //版权所有2010年uu MyCompanyName uuu。版权所有。 // #导入“FurballAppDelegate.h” #导入“StartViewController.h” #导入“SubjectViewController.h” @实现StartViewController -(void)负荷视图{ UIView*视图=[[UIView alloc]initWithFrame:[UIScreen mainScreen].applicationFrame]; UIButton*btn=[UIButton Button类型为:UIButtonyPeroundRect]; [btn设置帧:CGRectMake(50,50,100,30)]; [btn setTitle:@“工作”状态:UIControlStateNormal]; [btn addTarget:self action:@selector(chooseSubject)for ControlEvents:UIControlEventTouchUpInside]; [视图添加子视图:btn]; FurballAppDelegate*应用程序=[[UIApplication sharedApplication]委托]; UIButton*btnBack=[UIButton Button类型:UIButtonTypeLoundRect]; [btnBack setFrame:CGRectMake(5010010030)]; [btnBack setTitle:@“工作”状态:UIControlStateNormal]; [btnBack addTarget:app action:@selector(popBack)for ControlEvents:UIControlEventTouchUpInside]; [视图添加子视图:btnBack]; self.view=视图; [查看发布]; } -(无效)viewDidLoad{ [超级视图下载]; } -(void)选择Subject{ FurballAppDelegate*应用程序=[[UIApplication sharedApplication]委托]; SubjectViewController*subjectController=[[SubjectViewController alloc]init]; [应用程序下一步:主题控制器]; } -(无效)解除锁定{ [super dealoc]; } @结束 把我所有的文件都推进去就行了。甚至当我触摸“btnBack”时,导航控制器也会弹出到MainViewController。。。但是当我在SubjectViewController上创建一个与StartViewController上相同的后退按钮时,它会给我一个奇怪的错误


我非常感谢您的帮助:)

因为您意识到这意味着您试图访问一个无效的内存地址,所以您需要检查代码中是否存在无效的内存访问

幸运的是,对于这个错误,它通常就在接收EXEC\u BAD\u访问的行上。看看那条线上的对象和指针。它们都有意义吗?如果没有,请备份一行。清洗、冲洗并重复。在某些地方,您没有正确分配对象、过早释放对象、堆栈损坏或某些变量指向随机垃圾


在收到错误的地方发布一些代码可能会让我们发现错误。但是,如果不能够在调试器中单步执行,也可能无法查看。

因为您意识到这意味着您试图访问无效的内存地址,所以需要检查代码是否存在无效的内存访问

幸运的是,对于这个错误,它通常就在接收EXEC\u BAD\u访问的行上。看看那条线上的对象和指针。它们都有意义吗?如果没有,请备份一行。清洗、冲洗并重复。在某些地方,您没有正确分配对象、过早释放对象、堆栈损坏或某些变量指向随机垃圾


在收到错误的地方发布一些代码可能会让我们发现错误。但是,如果不能够在调试器中单步执行,也可能无法查看。弹出视图控制器时获取EXEC\u BAD\u访问权限会使我怀疑 // // FurballAppDelegate.h // Furball // // Created by Morgan Family on 7/28/10. // Copyright __MyCompanyName__ 2010. All rights reserved. // #import <UIKit/UIKit.h> @class MainViewController, StartViewController, SubjectViewController; @interface FurballAppDelegate : NSObject <UIApplicationDelegate> { UIWindow *window; UINavigationController *navController; MainViewController *mainController; StartViewController *startController; } @property (nonatomic, retain) UIWindow *window; @property (nonatomic, retain) UINavigationController *navController; @property (nonatomic, retain) MainViewController *mainController; @property (nonatomic, retain) StartViewController *startController; - (void)popBack; - (void)pushNext:(UIViewController *)next; - (void)showStartMenu; @end // // FurballAppDelegate.m // Furball // // Created by Morgan Family on 7/28/10. // Copyright __MyCompanyName__ 2010. All rights reserved. // #import "FurballAppDelegate.h" #import "MainViewController.h" #import "StartViewController.h" #import "SubjectViewController.h" @implementation FurballAppDelegate @synthesize window; @synthesize navController; @synthesize mainController; @synthesize startController; - (void)applicationDidFinishLaunching:(UIApplication *)application { window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; mainController = [[MainViewController alloc] init]; navController = [[UINavigationController alloc] initWithRootViewController:mainController]; [window addSubview:navController.view]; [window makeKeyAndVisible]; } - (void)dealloc { [mainController release]; [startController release]; [subjectController release]; [window release]; [super dealloc]; } - (void)popBack { [navController popViewControllerAnimated:YES]; } - (void)pushNext:(UIViewController *)next { [navController pushViewController:next animated:YES]; } - (void)showStartMenu { startController = [[StartViewController alloc] init]; [self pushNext:startController]; } @end // // StartViewController.h // Furball // // Created by Morgan Family on 8/4/10. // Copyright 2010 __MyCompanyName__. All rights reserved. // #import @interface StartViewController : UIViewController { } - (void)showSubjectMenu; @end // // StartViewController.m // Furball // // Created by Morgan Family on 8/4/10. // Copyright 2010 __MyCompanyName__. All rights reserved. // #import "FurballAppDelegate.h" #import "StartViewController.h" #import "SubjectViewController.h" @implementation StartViewController - (void)loadView { UIView *view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame]; UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [btn setFrame:CGRectMake(50, 50, 100, 30)]; [btn setTitle:@"DO WORK" forState:UIControlStateNormal]; [btn addTarget:self action:@selector(chooseSubject) forControlEvents:UIControlEventTouchUpInside]; [view addSubview:btn]; FurballAppDelegate *app = [[UIApplication sharedApplication] delegate]; UIButton *btnBack = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [btnBack setFrame:CGRectMake(50, 100, 100, 30)]; [btnBack setTitle:@"DO WORK" forState:UIControlStateNormal]; [btnBack addTarget:app action:@selector(popBack) forControlEvents:UIControlEventTouchUpInside]; [view addSubview:btnBack]; self.view = view; [view release]; } - (void)viewDidLoad { [super viewDidLoad]; } - (void)chooseSubject { FurballAppDelegate *app = [[UIApplication sharedApplication] delegate]; SubjectViewController *subjectController = [[SubjectViewController alloc] init]; [app pushNext:subjectController]; } - (void)dealloc { [super dealloc]; } @end // // FurballNavigationController.h // Furball // #import <UIKit/UIKit.h> #import <QuartzCore/QuartzCore.h> @class UIViewController; @protocol FurballNavigationDelegate; @interface FurballNavigationController : UIViewController <FurballNavigationDelegate> { NSMutableArray *viewControllers; int currentController; UIViewController *pendingView; int pendingDirection; } @property (nonatomic, retain) NSMutableArray *viewControllers; @property (nonatomic) int currentController; - (id)initWithRootViewController:(UIViewController *)viewController; - (id)initWithViewControllers:(NSArray *)controllers; - (void)addObject:(id)object; - (void)removeObject:(unsigned int)index; - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)yesOrNo; - (UIViewController *)popViewControllerAnimated:(BOOL)yesOrNo; - (void)popToRootViewControllerAnimated:(BOOL)yesOrNo; - (void)animateSlide:(UIViewController *)viewController direction:(NSString * const)direction; @end @protocol FurballNavigationDelegate @optional - (void)viewFinishedAnimation; - (void)viewShouldPush:(UIViewController *)viewController; - (void)viewWillPush:(UIViewController *)viewController; - (void)viewDidPush:(UIViewController *)viewController; - (UIViewController *)viewShouldPopAnimated:(BOOL)yesOrNo; - (UIViewController *)viewWillPopAnimated:(BOOL)yesOrNo; - (UIViewController *)viewDidPopAnimated:(BOOL)yesOrNo; @end // // FurballNavigationController.m // Furball // #import "FurballNavigationController.h" @implementation FurballNavigationController @synthesize viewControllers; @synthesize currentController; - (id)init { NSMutableArray *arr = [[NSMutableArray alloc] init]; self.viewControllers = arr; [arr release]; currentController = 0; pendingView = nil; pendingDirection = 0; return self; } - (id)initWithRootViewController:(UIViewController *)viewController { if(self = [self init]) { if(viewController == nil) { viewController = [[UIViewController alloc] init]; viewController.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame]; [viewController.view setBackgroundColor:[UIColor redColor]]; } [self addObject:viewController]; self.view = viewController.view; } return self; } - (id)initWithViewControllers:(NSArray *)controllers { if(self = [self initWithViewControllers:[controllers objectAtIndex:0]]) { viewControllers = (NSMutableArray *)controllers; } return self; } - (void)addObject:(id)object { [viewControllers addObject:[NSString stringWithFormat:@"%@", [object class]]]; } - (void)removeObject:(unsigned int)index { [viewControllers removeObjectAtIndex:(NSInteger)index]; } - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)yesOrNo { pendingView = viewController; pendingDirection = 1; yesOrNo ? [self animateSlide:viewController direction:kCATransitionFromRight] : [self viewFinishedAnimation]; } - (UIViewController *)popViewControllerAnimated:(BOOL)yesOrNo { UIViewController *controller = [[NSClassFromString([viewControllers objectAtIndex:currentController-1]) alloc] init]; pendingView = controller; pendingDirection = -1; yesOrNo ? [self animateSlide:controller direction:kCATransitionFromLeft] : [self viewFinishedAnimation]; return controller; } - (void)popToRootViewControllerAnimated:(BOOL)yesOrNo { UIViewController *controller = [[NSClassFromString([viewControllers objectAtIndex:0]) alloc] init]; pendingView = controller; pendingDirection = -2; yesOrNo ? [self animateSlide:controller direction:kCATransitionFromLeft] : [self viewFinishedAnimation]; } - (void)animateSlide:(UIViewController *)viewController direction:(NSString * const)direction { UIView *currentView = self.view; UIView *theWindow = [currentView superview]; UIView *newView = viewController.view; [currentView removeFromSuperview]; [theWindow addSubview:newView]; CATransition *animation = [CATransition animation]; [animation setDuration:0.5]; [animation setType:kCATransitionPush]; [animation setSubtype:direction]; [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; [[theWindow layer] addAnimation:animation forKey:@"SwitchToView1"]; NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(viewFinishedAnimation) userInfo:nil repeats:NO]; timer; } - (void)viewFinishedAnimation { self.view = pendingView.view; if(pendingDirection > 0) { [self addObject:pendingView]; currentController++; } else if(pendingDirection == -1) { [self removeObject:currentController]; currentController--; } else if(pendingDirection == -2) { for(int i = 1; i < [viewControllers count]; i++) [self removeObject:i]; currentController = 0; } } - (void)viewShouldPush:(UIViewController *)viewController { } - (void)viewWillPush:(UIViewController *)viewController { } - (void)viewDidPush:(UIViewController *)viewController { } - (UIViewController *)viewShouldPopAnimated:(BOOL)yesOrNo { return [[UIViewController alloc] init]; } - (UIViewController *)viewWillPopAnimated:(BOOL)yesOrNo { return [[UIViewController alloc] init]; } - (UIViewController *)viewDidPopAnimated:(BOOL)yesOrNo { return [[UIViewController alloc] init]; } @end