【问题标题】:pushViewController crashed on iPadpushViewController 在 iPad 上崩溃
【发布时间】:2012-08-30 00:13:20
【问题描述】:

我正在做一些非常简单的事情。试图 pushViewController。它在 iPhone 上运行良好,但在 iPad 上,它崩溃了! SIGABRT:

libsystem_kernel.dylib`__pthread_kill:
0x35d85324:  mov    r12, #328
0x35d85328:  svc    #128
0x35d8532c:  blo    0x35d85344                ; __pthread_kill + 32
0x35d85330:  ldr    r12, [pc, #4]             ; __pthread_kill + 24
0x35d85334:  ldr    r12, [pc, r12]
0x35d85338:  b      0x35d85340                ; __pthread_kill + 28
0x35d8533c:  stmibeqr4, {r5, r6, r7, r10, r11}
0x35d85340:  bx     r12
0x35d85344:  bx     lr

有什么想法吗?谢谢!

Principal *cvc;

NSString *deviceType = [UIDevice currentDevice].model;
if([deviceType isEqualToString:@"iPhone"] || [deviceType isEqualToString:@"iPod touch"]) {
    cvc = [[Principal alloc] initWithNibName:@"Principal" bundle:nil];
} else {
    cvc = [[Principal alloc] initWithNibName:@"Principal_iPad" bundle:nil];
}

[cvc setImg:flippedImage];

if([deviceType isEqualToString:@"iPhone"] || [deviceType isEqualToString:@"iPod touch"]) {

    [self.navigationController pushViewController:cvc animated:YES];

} else {

    [self.navigationController pushViewController:cvc animated:YES];

}

[cvc release];

【问题讨论】:

  • 你应该使用 UI_USER_INTERFACE_IDIOM,而不是比较字符串。
  • 我现在正在使用 UI_USER_INTERFACE_IDIOM...但是,无论如何,这不是导致崩溃的原因!
  • 这就是为什么我没有把它作为一个解决方案;)只是说......

标签: iphone ios ipad crash pushviewcontroller


【解决方案1】:

我认为检查 UI Interface Idiom 要容易得多:

    Principal *cvc;
    if(UI_USER_INTERFACE_IDIOM() = UIUserInterfaceIdiomPhone) {
        cvc = [[Principal alloc] initWithNibName:@"Principal" bundle:nil];
    } else {
        cvc = [[Principal alloc] initWithNibName:@"Principal_iPad" bundle:nil];
    }
    [cvc setImg:flippedImage];
    [self.navigationController pushViewController:cvc animated:YES];
    [cvc release];

此外,您在最后一个 if 语句的两种情况下都在做同样的事情,所以您可以像我在代码上所做的那样将其删除。

为了对您有更多帮助,我需要查看崩溃前抛出的实际异常文本。

我可以想象的问题是self.navigationController 是在 iPhone 上定义的,但不是在 iPad 上,或者用于 iPad 的初始化程序正在返回一个 nil VC,并且推送一个 nil 视图控制器会抛出一个例外。

【讨论】:

  • 感谢您的帮助!如何获得“崩溃前引发的实际异常文本”?谢谢!
  • 我在这里只能看到:libsystem_kernel.dylib`__pthread_kill: 0x37e0d324: mov r12, #328 0x37e0d328: svc #128 0x37e0d32c: blo 0x37e0d344; __pthread_kill + 32 0x37e0d330:ldr r12,[pc,#4]; __pthread_kill + 24 0x37e0d334:ldr r12,[pc,r12] 0x37e0d338:b 0x37e0d340; __pthread_kill + 28 0x37e0d33c: stmibeqr4, {r5, r6, r7, r10, r11} 0x37e0d340: bx r12 0x37e0d344: bx lr 如何获取全文?
  • 抛出异常时控制台上会显示文本,如下所示:2012-09-03 15:21:53.575 YourAppName[74497:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[1]' *** First throw call stack:
【解决方案2】:

这有点问题;

Principal *cvc;
NSString *deviceType = [UIDevice currentDevice].model;
if([deviceType isEqualToString:@"iPhone"] || [deviceType isEqualToString:@"iPod touch"]) {
    cvc = [[Principal alloc] initWithNibName:@"Principal" bundle:nil];
} else {
    cvc = [[Principal alloc] initWithNibName:@"Principal_iPad" bundle:nil];
    // This should be allocated with the class Principal_iPad not Principal.
}

应该是这样的,

NSString *deviceType = [UIDevice currentDevice].model;
if([deviceType isEqualToString:@"iPhone"] || [deviceType isEqualToString:@"iPod touch"]) {
    Principal *cvc = [[Principal alloc] initWithNibName:@"Principal" bundle:nil];
    [cvc setImg:flippedImage];
    [self.navigationController pushViewController:cvc animated:YES];
    [cvc release]
} else {
    Principal_iPad *cvc = [[Principal_iPad alloc] initWithNibName:@"Principal_iPad" bundle:nil];
    [cvc setImg:flippedImage];
    [self.navigationController pushViewController:cvc animated:YES];
    [cvc release]
}

【讨论】:

  • Principal_iPad 指向 Principal 类... Principal_iPad 只是具有 ipad 布局的不同 xib!
  • 哦,好吧..也许指向类有问题,它可能返回 nil。
【解决方案3】:

要获得实际异常,您必须设置 NSZombieEnabled。要设置NSZombieEnabled 转到产品-> 编辑方案-> 参数在参数中,您将在此处找到“环境变量”,只需单击+ 符号并添加NSZombieEnabled 并选中旁边的复选框。然后你可以看到异常。我认为问题可能不在于 NavigationController。它可能在 PricipalViewController 中,只需通过在 PrincipalViewController 中的 ViewDidLoad 处放置断点来检查它。

【讨论】:

  • NSZombieEnabled,不是NSZoombieEnabled
【解决方案4】:

您的 xib 可能有问题,例如某些不存在的连接(通常在您复制 xib 元素并忘记删除选择器等时出现)。您可以通过将以下代码添加到您的 appDelegate 来找到您的堆栈跟踪:

void uncaughtExceptionHandler(NSException *exception) {
   NSLog(@"CRASH: %@", exception);
   NSLog(@"Stack Trace: %@", [exception callStackSymbols]);
   // Internal error reporting
}

上面的方法应该是你appDelegate.m中的第一个

然后,将NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler); 添加为application:didFinishLaunchingWithOptions: 方法的第一行,如下所示:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);//should be the first line
    ....
    ....
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-11
    • 2012-11-26
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多