2015-02-08 94 views
1

我是Swift的新手,我很努力地學習它,但我遇到了一個謎題。正如你在下面的圖片中看到的那樣,有一些控件正確鏈接到這個視圖控制器,並且在按下UI中的一個按鈕時我們執行下面的代碼,但我總是得到一個EXC_BAD_INSTRUCTION。我不明白爲什麼!EXC_BAD_INSTRUCTION按下按鈕

enter image description here

這裏是從堆棧跟蹤一些信息。

(lldb) thread info 
thread #1: tid = 0x9319, 0x0006c5d5 App`App.AViewController.sendCommentViaEmail (self=<unavailable>)() ->() + 9349 at AViewController.swift:49, queue = 'com.apple.main-thread', stop reason = EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) 

(lldb) frame select 1 
frame #1: 0x037067cd libobjc.A.dylib`-[NSObject performSelector:withObject:withObject:] + 84 
libobjc.A.dylib`-[NSObject performSelector:withObject:withObject:] + 84: 
-> 0x37067cd: addl $0x1c, %esp 
    0x37067d0: popl %esi 
    0x37067d1: popl %edi 
    0x37067d2: popl %ebx 

編輯:

堆棧跟蹤下面

* thread #1: tid = 0x1e19, 0x0005a5d5 A`A.AViewController.sendCommentViaEmail (self=<unavailable>)() ->() + 9349 at AViewController.swift:49, queue = 'com.apple.main-thread', stop reason = EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) 
    * frame #0: 0x0005a5d5 A`A.AViewController.sendCommentViaEmail (self=<unavailable>)() ->() + 9349 at AViewController.swift:49 
    frame #1: 0x036f47cd libobjc.A.dylib`-[NSObject performSelector:withObject:withObject:] + 84 
    frame #2: 0x01ea323d UIKit`-[UIApplication sendAction:to:from:forEvent:] + 99 
    frame #3: 0x02213840 UIKit`-[UIBarButtonItem(UIInternal) _sendAction:withEvent:] + 139 
    frame #4: 0x036f47cd libobjc.A.dylib`-[NSObject performSelector:withObject:withObject:] + 84 
    frame #5: 0x01ea323d UIKit`-[UIApplication sendAction:to:from:forEvent:] + 99 
    frame #6: 0x01ea31cf UIKit`-[UIApplication sendAction:toTarget:fromSender:forEvent:] + 64 
    frame #7: 0x01fd6e86 UIKit`-[UIControl sendAction:to:forEvent:] + 69 
    frame #8: 0x01fd72a3 UIKit`-[UIControl _sendActionsForEvents:withEvent:] + 598 
    frame #9: 0x01fd650d UIKit`-[UIControl touchesEnded:withEvent:] + 660 
    frame #10: 0x01ef360a UIKit`-[UIWindow _sendTouchesForEvent:] + 874 
    frame #11: 0x01ef40e5 UIKit`-[UIWindow sendEvent:] + 791 
    frame #12: 0x01eb9549 UIKit`-[UIApplication sendEvent:] + 242 
    frame #13: 0x01ec937e UIKit`_UIApplicationHandleEventFromQueueEvent + 20690 
    frame #14: 0x01e9db19 UIKit`_UIApplicationHandleEventQueue + 2206 
    frame #15: 0x039791df CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15 
    frame #16: 0x0396eced CoreFoundation`__CFRunLoopDoSources0 + 253 
    frame #17: 0x0396e248 CoreFoundation`__CFRunLoopRun + 952 
    frame #18: 0x0396dbcb CoreFoundation`CFRunLoopRunSpecific + 443 
    frame #19: 0x0396d9fb CoreFoundation`CFRunLoopRunInMode + 123 
    frame #20: 0x085dc24f GraphicsServices`GSEventRunModal + 192 
    frame #21: 0x085dc08c GraphicsServices`GSEventRun + 104 
    frame #22: 0x01ea18b6 UIKit`UIApplicationMain + 1526 
    frame #23: 0x000919cc A`main(argc=1, argv=0xbffaa62c) + 76 at main.m:12 
    frame #24: 0x04490ac9 libdyld.dylib`start + 1 

下面是我使用的屬性: 我得到了相同的結果,他們是否被鏈接到UI與否。

Properties linked to the UI controls and same result

+0

顯示來自Xcode的堆棧跟蹤。 – gnasher729 2015-02-08 17:53:11

+0

如何實例化此代碼所在的視圖控制器? – pbasdf 2015-02-15 23:47:54

+0

您能提供交換機的連接檢查器的屏幕截圖嗎? – Oren 2015-02-18 04:14:06

回答

2

哪裏emailToMyselfSwitch從何而來?如果它是一個IBOutlet它似乎忘記將它從IB連接到您的代碼。如果情況並非如此,請展示更多背景。

+0

不,它已經連接,甚至不是,它不應該崩潰!至少這是我知道的.. – Maystro 2015-02-08 18:52:14

+2

它會崩潰。由於您將屬性定義爲解包可選,但沒有來自Interface Builder的連接,因此該屬性將爲零:因此試圖訪問解包的(無)可選將嘗試取消引用空指針 – 2015-02-08 18:58:10

+0

確保控件與您的IBOutlet通過右鍵單擊界面生成器的開關控件 – 2015-02-08 18:59:58

1

這個錯誤EXC_BAD_INSTRUCTION通常意味着您正在調用一個空對象或無法響應選擇器的對象的屬性或方法(選擇器?),即self.null.on或因爲釋放而無法訪問的屬性。

過去我遇到了麻煩,這些虛弱的變量正在消失。嘗試刪除您的財產中的weak

1

你的代碼是正確的。問題不在與插座連接。我已經測試並打印出來:「Value:nil」 問題出在其他代碼部分。 消息「self =」不正常。 您可以向我們展示更多信息。

enter image description here