0

我的应用程序有时会在启动时崩溃。在堆栈跟踪中,仅来自内置框架的消息。崩溃日志的摘录:

OS Version:      iPhone OS 3.1.3 (7E18)
Report Version:  104

Exception Type:  EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x000e6000
Crashed Thread:  0

Thread 0 Crashed:
0   CoreGraphics                       0x339305d8 argb32_image_mark_RGB32 + 704
1   CoreGraphics                       0x338dbcd4 argb32_image + 1640
2   libRIP.A.dylib                     0x320d99f0 ripl_Mark
3   libRIP.A.dylib                     0x320db3ac ripl_BltImage
4   libRIP.A.dylib                     0x320cc2a0 ripc_RenderImage
5   libRIP.A.dylib                     0x320d5238 ripc_DrawImage
6   CoreGraphics                       0x338d7da4 CGContextDelegateDrawImage + 80
7   CoreGraphics                       0x338d7d14 CGContextDrawImage + 364
8   UIKit                              0x324ee68c compositeCGImageRefInRect
9   UIKit                              0x324ee564 -[UIImage(UIImageDeprecated) compositeToRect:fromRect:operation:fraction:]
10  UIKit                              0x32556f44 -[UINavigationBar drawBackButtonBackgroundInRect:withStyle:pressed:]
11  UIKit                              0x32556b00 -[UINavigationItemButtonView drawRect:]
12  UIKit                              0x324ecbc4 -[UIView(CALayerDelegate) drawLayer:inContext:]
13  QuartzCore                         0x311cacfc -[CALayer drawInContext:]
14  QuartzCore                         0x311cab00 backing_callback
15  QuartzCore                         0x311ca388 CABackingStoreUpdate
16  QuartzCore                         0x311c978c -[CALayer _display]
17  QuartzCore                         0x311c941c -[CALayer display]
18  QuartzCore                         0x311c9368 CALayerDisplayIfNeeded
19  QuartzCore                         0x311c8848 CA::Context::commit_transaction(CA::Transaction*)
20  QuartzCore                         0x311c846c CA::Transaction::commit()
21  QuartzCore                         0x311c8318 +[CATransaction flush]
22  UIKit                              0x324f5e94 -[UIApplication _reportAppLaunchFinished]
23  UIKit                              0x324a7a80 -[UIApplication _runWithURL:sourceBundleID:]
24  UIKit                              0x324f8df8 -[UIApplication handleEvent:withNewEvent:]
25  UIKit                              0x324f8634 -[UIApplication sendEvent:]
26  UIKit                              0x324f808c _UIApplicationHandleEvent
27  GraphicsServices                   0x335067dc PurpleEventCallback
28  CoreFoundation                     0x323f5524 CFRunLoopRunSpecific
29  CoreFoundation                     0x323f4c18 CFRunLoopRunInMode
30  UIKit                              0x324a6c00 -[UIApplication _run]
31  UIKit                              0x324a5228 UIApplicationMain
32  Journaler                          0x000029ac main (main.m:14)
33  Journaler                          0x00002948 start + 44

文件main.m尽可能简单:

#import <UIKit/UIKit.h>

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

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

我的应用程序崩溃的原因是什么?

JournalerAppDelegate.h

// ...

@interface JournalerAppDelegate : NSObject <UIApplicationDelegate> {
    // ...
    UINavigationController *navigationController;
    AccountsViewController *rootViewController;
    // ...
}

JournalerAppDelegate.m

// ...

@implementation JournalerAppDelegate
// ...
- (void)applicationDidFinishLaunching:(UIApplication *)application {
    // ...
    rootViewController = [[AccountsViewController alloc] initWithNibName:@"AccountsViewController" bundle:nil];
    navigationController = [[UINavigationController alloc] initWithRootViewController:rootViewController];

    NSString *accountKey = // ...;
    if (accountKey) {
        LJAccount *account = // ...;
        if (account) {
            [rootViewController view]; // forces to load view
            [rootViewController openAccount:account animated:NO];
        }
    }

    [window addSubview:navigationController.view];
    [window makeKeyAndVisible];
}
// ...

AccountsViewController.h

// ...

@interface AccountsViewController : UIViewController</* ... */> {
    // ...
    NSMutableDictionary *cacheTabBarControllers;
    // ...
}

AccountsViewController.m

// ...

@implementation AccountsViewController
// ...
- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle {
    if (self = [super initWithNibName:nibName bundle:nibBundle]) {
        cacheTabBarControllers = [[NSMutableDictionary alloc] initWithCapacity:1];
    }
    return self;
}
// ...
- (void)openAccount:(LJAccount *)account animated:(BOOL)animated {
    AccountTabBarController *tabBarController = [[cacheTabBarControllers objectForKey:account.title] retain];
    if (!tabBarController) {
        tabBarController = [[AccountTabBarController alloc] initWithAccount:account];
        [cacheTabBarControllers setObject:tabBarController forKey:account.title];
    }

    [self.navigationController pushViewController:tabBarController animated:animated];
    [tabBarController release];
}
// ...
4

1 回答 1

0

看起来它在尝试绘制UINavagationBar' 后退按钮时崩溃了。您的应用程序启动时是否有后退按钮?

您是否正在从以前的运行中恢复导航堆栈?您是否正在创建一个不仅仅是根视图控制器的导航堆栈。

您的内存管理在所有需要的地方都正确吗?

于 2010-04-07T13:41:01.810 回答