2011-10-18 37 views
0

我有這樣的代碼:EXC_BAD_INSTRUCTION在performSelector

dispatch_async(dispatch_get_main_queue(), ^(void) 
{ 
    SEL selector = @selector(callback:); 
    [self.delegate performSelector:selector withObject:self]; 
}); 

兩個self.delegateselfnil

我得到EXC_BAD_INSTRUCTIONperformSelector行。

有什麼想法?

+0

問題,你能得到任何其他代碼塊的工作?我知道在使用某些構建設置的塊時可能會得到「糟糕的指令」。 –

回答

3

嘗試直接使用選擇器,並確保callback:self.delegate一個有效方法:

dispatch_async(dispatch_get_main_queue(), ^(void) 
{ 
    [self.delegate performSelector:@selector(callback:) withObject:self]; 
}); 

另一個調試尖端是設置NSZombieEnabledMallocStackLogging,並在調試器guard malloc。然後,當你的應用程序崩潰,在gdb的控制檯輸入:

(gdb) info malloc-history 0x543216 

替換0x543216與導致崩潰的對象的地址,你會得到一個更加有用的堆棧跟蹤,它應該幫助你查明導致問題的代碼中的確切行。

See this article for more detailed instructions.

+1

主。我希望一年前我讀過這篇文章。我曾經使用過其中一些工具,但並不完全如此。我剛剛得到了我的StackTrace ......頭腦風暴! –

+0

@Iurburbus :)很高興它幫助你。 – chown

+1

鏈接說404! –

0

self.delegate可能已被釋放。如果您自己清除指針,則指針將僅爲nil,或者它是ARC下的weak引用。嘗試啓用「啓用殭屍對象」選項。

要做到這一點,請點擊工具欄中的方案名稱(例如「MyApp」),然後選擇「Edit Scheme ...」編輯您當前的方案。點擊左側源列表中的「運行MyApp」項,然後選擇「診斷」選項卡,並打開「啓用殭屍對象」複選框。

0

我在Xcode 9中調試了從主線程外部調用UI的問題。我只是試圖從主線程運行阻塞代碼..而已經在主線程!

解決方案是使用此方法(當然聲明爲__block)我需要從主線程修改(在我的情況下只是獲得UIView寬度)的所有變量。

當然,如果你需要的東西異步,只是改變dispatch_sync到dispatch_async

` 
+ (void)runOnMainSafelyBlocking:(void(^)(void))block; 
{ 
    if ([NSThread isMainThread]) 
    { 
     block(); 
    } 
    else 
    { 
     dispatch_sync(dispatch_get_main_queue(), block); 
    } 
} 
`