UITabBarController抛出EXC_BAD_ACCESS

时间:2011-07-30 15:45:06

标签: iphone objective-c

我在app delegate中创建了一个标签栏控制器。这是.h和.m文件:

#import <UIKit/UIKit.h>

@interface appAppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
UITabBarController *tabBar;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) UITabBarController *tabBar;

@end

这是m文件中的相关功能:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

UINavigationController *localNav;

tabBar = [[UITabBarController alloc] init];
NSMutableArray *controllerArray = [[NSMutableArray alloc] initWithCapacity:2];

FirstViewController  *firstViewController = [[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil];
localNav = [[UINavigationController alloc] initWithRootViewController:FirstViewController];
localNav.navigationBar.tintColor = [UIColor blackColor];

[controllerArray addObject:localNav];

[firstViewController release];

SecondViewController *secondViewController;
secondViewController = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
localNav = [[UINavigationController alloc] initWithRootViewController:secondViewController];
[controllerArray addObject:localNav];
[localNav release];
[SecondViewController release];

tabBar.viewControllers = controllerArray;

[controllerArray release];
[localNav release];

[window addSubview:tabBar.view];

[self.window makeKeyAndVisible];

return YES;
}

我更改了变量名称(即第一个视图不称为第一个视图控制器)。该应用程序将加载并显示两个选项卡,我可以选择。当我尝试显示模态弹出窗口时出现问题。我有一个按钮,按下时应显示模态。

这是.h文件。自定义按钮只是围绕按钮的角落,而不是它是UIButton的直线延伸。代表只有两个按钮的功能,可以是取消或取消。

#import <UIKit/UIKit.h>
#import "CustomButton.h"
#import "StartModal.h"
#import "CurrentEntry.h"

@interface FirstViewController : UIViewController <StartModalDelegate>{
CustomButton *startEntry;

}

@property (nonatomic, retain) IBOutlet CustomButton *startEntry;

 - (IBAction) startLogEntry;
 - (void) locationSelection;

- (void) dismissHandler;
- (void) saveHandler;

@end

当我按下按钮功能时,EXC_BAD_ACCESS进入。这是.m文件:

- (IBAction) startLogEntry {
NSLog(@"start the entry here");

StartPoopModal *modal = [[StartModal alloc] initWithNibName:@"StartModal" bundle:nil];
[modal setDelegate:self];

UINavigationController *localNav;
localNav = [[UINavigationController alloc] initWithRootViewController:modal];
localNav.navigationBar.tintColor = [UIColor blackColor];
[self.tabBarController presentModalViewController:localNav animated:YES];
[modal release];
}

[self.tabBarController presentModalViewController ....]是抛出错误的原因。这在过去是有效的,并且由于某种原因它会抛出错误。据我所知,我没有改变它。我没有任何形式的版本控制,所以我不能仔细检查它。

2 个答案:

答案 0 :(得分:2)

首先你做到了。

localNav = [[UINavigationController alloc] initWithRootViewController:FirstViewController];
[controllerArray addObject:localNav];
然后你做到了这一点。那是泄漏。在给它一个新的OWNED对象之前你没有释放本地导航。

localNav = [[UINavigationController alloc] initWithRootViewController:secondViewController];
[controllerArray addObject:localNav];
之后你做了这个

[localNav release];

然后又过了一​​会儿,你再次打电话给[localNav release]。

而且,这条线是可疑的

 StartPoopModal *modal = [[StartModal alloc] initWithNibName:@"StartModal" bundle:nil];

你分配了两个不同的课程

我只能说是检查以上所有错误的编程并确保读取内存管理规则。 http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html

非常有帮助。

答案 1 :(得分:0)

如果该行

[self.tabBarController presentModalViewController:localNav animated:YES];

导致错误的访问异常(EXC_BAD_ACCESS),那么你应该寻找坏指针。我看到有四个指针:selfself.tabBarControllerlocalNavmodal

我同意@PatrickAnarna您分配modal的行是可疑的,因为类型不匹配,但如果StartModal是真正的类,则不应导致错误的访问异常。但是,如果modal为nil,那么当标签栏控制器尝试访问modal的视图时,您会遇到错误的访问异常。或者更具体地说,当标签栏控制器尝试访问localNav的视图时,localNav依次尝试访问modal的视图。

我不知道localNav将如何为零或无效,但你仍然应该检查一下。 self在实例方法中永远不应为nil,如果self是由标签栏控制器管理的视图控制器,self.tabBarController也不应为零或无效。但是,你不应该认为它们是正确的,因为它们应该是 - 毕竟代码应该起作用,但事实并非如此。

无论如何,在一天结束时,错误是由解除引用错误的指针引起的。找到被解除引用的指针,你会发现错误。