2012-08-30 95 views
0

我正在做一件非常簡單的事情。試圖pushViewController。它在iPhone上很好用,但在iPad上,它崩潰了! SIGABRT:pushViewController在iPad上墜毀

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]; 
+0

你應該使用UI_USER_INTERFACE_IDIOM,而不是比較字符串。 –

+0

現在使用UI_USER_INTERFACE_IDIOM ...但是,無論如何,這不是導致崩潰的原因! –

+0

這就是爲什麼我沒有把它作爲一個解決方案;)只是說... –

回答

1

這有些問題,

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] 
} 
+1

Principal_iPad指向類Principal ... Principal_iPad只是一個不同的xib與ipad佈局! –

+0

哦,好吧..可能是指着這個類有什麼問題,它可能會返回零。 – dianz

2

我覺得這是很容易檢查的UI界面成語:

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視圖控制器會拋出異常。

+0

謝謝你的幫助!如何獲得「在崩潰之前拋出的實際異常文本」?謝謝! –

+0

我在這裏可以看到的是: 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 我怎樣才能得到充分的文本? –

+0

當引發異常時,文本顯示在控制檯上,如下所示:'2012-09-03 15:21:53.575 YourAppName [74497:c07] ***由於未捕獲異常'NSInvalidArgumentException'導致終止應用程序,原因如下: '*** - [__ NSPlaceholderDictionary initWithObjects:forKeys:count:]:試圖從對象中插入nil對象[1]' ***第一次拋出調用堆棧:' – Zebs

0

要獲得實際例外您必須設置NSZombieEnabled。設置NSZombieEnabled轉到產品 - >編輯方案 - >參數在參數中,您會在這裏找到'環境變量',只需點擊+標誌並添加NSZombieEnabled並選中旁邊的複選框。然後你可以看到異常。我認爲這個問題可能不適用於NavigationController。它可能在PricipalViewController中,只需在PrincipalViewController中將breakPoints放置在ViewDidLoad處進行檢查即可。

+1

'NSZombieEnabled',而不是'NSZoombieEnabled'! – tipycalFlow

+0

@tipycalFlow謝謝你! – SriKanth

0

您的xib可能會出現某些問題,例如某些不存在的連接(通常在您複製xib元素並忘記刪除選擇器等時出現)。您可以通過添加以下代碼到你的appDelegate找到你的堆棧跟蹤:

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

上面的方法應該是在你的appDelegate.m

然後第一個,在你的application:didFinishLaunchingWithOptions:方法添加NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);爲第一線如下:

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