我在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 ....]是抛出错误的原因。这在过去是有效的,并且由于某种原因它会抛出错误。据我所知,我没有改变它。我没有任何形式的版本控制,所以我不能仔细检查它。
答案 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),那么你应该寻找坏指针。我看到有四个指针:self
,self.tabBarController
,localNav
和modal
。
我同意@PatrickAnarna您分配modal
的行是可疑的,因为类型不匹配,但如果StartModal
是真正的类,则不应导致错误的访问异常。但是,如果modal
为nil,那么当标签栏控制器尝试访问modal
的视图时,您会遇到错误的访问异常。或者更具体地说,当标签栏控制器尝试访问localNav
的视图时,localNav
依次尝试访问modal
的视图。
我不知道localNav
将如何为零或无效,但你仍然应该检查一下。 self
在实例方法中永远不应为nil,如果self
是由标签栏控制器管理的视图控制器,self.tabBarController
也不应为零或无效。但是,你不应该认为它们是正确的,因为它们应该是 - 毕竟代码应该起作用,但事实并非如此。
无论如何,在一天结束时,错误是由解除引用错误的指针引起的。找到被解除引用的指针,你会发现错误。