按下按钮时的 EXC_BAD_INSTRUCTION

Posted

技术标签:

【中文标题】按下按钮时的 EXC_BAD_INSTRUCTION【英文标题】:EXC_BAD_INSTRUCTION upon pressing a button 【发布时间】:2015-02-08 17:43:52 【问题描述】:

我是 Swift 的新手,我正在尝试学习它,但我遇到了一个神秘的问题。正如您在下图中看到的,有一些控件正确链接到此视图控制器,并且在按下 UI 中的按钮时,我们执行下面的代码,但我总是得到一个 EXC_BAD_INSTRUCTION。我不明白为什么!

这是堆栈跟踪中的一些信息。

(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,我都得到了相同的结果。

【问题讨论】:

显示 Xcode 的堆栈跟踪。 如何实例化这段代码所在的视图控制器? 您能否提供交换机的 Connection Inspector 的屏幕截图? 您的情节提要与@IBOutlet var 之间是否有旧连接? 【参考方案1】:

emailToMyselfSwitch 来自哪里?如果它是 IBOutlet,您似乎忘记将它从 IB 连接到您的代码。如果不是这样,请显示更多上下文。

【讨论】:

不,它已经连接了,即使没有,它也不应该崩溃!!至少这是我所知道的...... 它会崩溃。因为您将属性定义为未包装的可选但没有来自 Interface Builder 的连接,所以该属性将为 nil:因此尝试访问您的未包装(nil)可选将尝试取消引用空指针 通过右键单击界面生成器上的开关控件,确保控件已链接到您的 IBOutlet 在我看来,开关控件仍然没有连接到您的插座。可能 action 已连接到 IBAction 但未连接到 IBOutlet,您需要同时连接两者。【参考方案2】:

此错误EXC_BAD_INSTRUCTION 通常意味着您正在对空对象或无法响应选择器的对象(即self.null.on)或无法访问的属性调用属性或方法(选择器?),因为它已发布。

过去我曾遇到过这些弱变量消失的麻烦。尝试删除您资源中的weak

【讨论】:

【参考方案3】:

您的代码是正确的。问题不在于与插座的连接。我已经测试并打印:“值:无” 问题出在代码的其他部分。 消息“self=”不正常。 您可以向我们展示更多信息。

【讨论】:

以上是关于按下按钮时的 EXC_BAD_INSTRUCTION的主要内容,如果未能解决你的问题,请参考以下文章

按下 UITextField 的小十字按钮时的动作

在SwiftUI中按下按钮时的随机图像[关闭]

按下后退按钮时的自定义动画 - iOS

按下锁定/主页按钮时的通知,单击返回选项卡片段时的通知

按下向上按钮时的自定义 Activity 转换

表格中的 WKInterfaceGroup 突出显示包含按下时的按钮