ios - 收到此错误 : thread 1: exc_bad_instruction(code=exc_i386_invop, subcode=0x0)

标签 ios swift reachability

我在 swift 2.0 中开发了一个 iOS 应用程序,并使用了一个名为 Reachability 的类来确定用户是否连接到互联网。应用程序运行,但编译器停止并输出此错误:

thread 1: exc_bad_instruction(code=exc_i386_invop,subcode=0x0)

这里是代码,注释处出错

func updateInterfaceWithReachability (reachability: Reachability)  {

    if reachability == self.hostReachability
    {
        self.checkStatus(reachability)

        let netStatus: NetworkStatus = reachability.currentReachabilityStatus()
        let connectionRequired: Bool = reachability.connectionRequired()

        var baseLabelText: NSString = ""

        if connectionRequired
        {
            baseLabelText = NSLocalizedString("Cellular data network is available.\nInternet traffic will be routed through it after a connection is established.", comment: "Reachability text if a connection is required")
        }
        else
        {
            baseLabelText = NSLocalizedString("Cellular data network is active.\nInternet traffic will be routed through it.", comment: "Reachability text if a connection is not required")
        }
    }


    if reachability == self.internetReachability  // error displayed here
    {
        self.checkStatus(reachability)
    }

    if reachability == self.wifiReachability
    {
        self.checkStatus(reachability)
    }

}

我也这样声明了 internetReachability

var internetReachability: Reachability!

这也是我在另一个名为 checkStatus() 的函数中初始化 internetReachability 的方式

func checkInternetConnection () {

    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("reachabilityChanged"), name: kReachabilityChangedNotification, object: nil)

    let remoteHostName: String = "www.apple.com"


    self.hostReachability = Reachability.init(hostName: remoteHostName)
    self.hostReachability.startNotifier()
    self.updateInterfaceWithReachability(self.hostReachability)

    self.internetReachability = Reachability.reachabilityForInternetConnection()
    self.internetReachability.startNotifier()
    self.updateInterfaceWithReachability(self.internetReachability)

    self.wifiReachability = Reachability.reachabilityForLocalWiFi()
    self.wifiReachability.startNotifier()
    self.updateInterfaceWithReachability(self.wifiReachability)
}

不明白错误是什么以及如何修复它。帮助表示赞赏。

最佳答案

代码在给定行崩溃,因为您将变量声明为隐式解包可选,这意味着在这种情况下该值被解包以便能够将其与 可达性 进行比较。但是因为您还没有为 internetReachability 设置任何东西,它仍然是 nil 并且代码崩溃,因为 nil 无法解包。

要解决这个问题,您必须要么必须

  • 明确检查nil
  • 或将变量声明为 var internetReachability: Reachability? 并在整个代码中处理可选值
  • 确保在尝试访问internetReachability 之前调用方法checkInternetConnection

幸运的是,通过简单地重新排列您的代码,这里为您提供了最后一个选项的简单版本:

func checkInternetConnection () {
    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("reachabilityChanged"), name: kReachabilityChangedNotification, object: nil)

    let remoteHostName: String = "www.apple.com"

    self.hostReachability = Reachability.init(hostName: remoteHostName)
    self.internetReachability = Reachability.reachabilityForInternetConnection()
    self.wifiReachability = Reachability.reachabilityForLocalWiFi()

    self.hostReachability.startNotifier()
    self.internetReachability.startNotifier()
    self.wifiReachability.startNotifier()

    self.updateInterfaceWithReachability(self.internetReachability)
    self.updateInterfaceWithReachability(self.wifiReachability)
    self.updateInterfaceWithReachability(self.hostReachability)
}

这样您就可以确保在 self.updateInterfaceWithReachability 尝试访问它们之前都设置了三种可达性类型。

关于ios - 收到此错误 : thread 1: exc_bad_instruction(code=exc_i386_invop, subcode=0x0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35070103/

相关文章:

ios - 当文档从后端更改时如何触发 Couchbase 与 iOS 同步

ios - 如何根据 UITableView 中的相邻行计算值

iOS:可达性 - 返回应用程序后 startNotifier 失败

ios - reachabilityWithHostName 不起作用

ios - 在 iOS 上检测互联网连接的最简单方法?

iOS:带有动态内容的 UIScrollView 使用 ContainerView(一步一步)

ios - AWS 移动中心登录 UI

ios - 向 Storyboard添加额外的预览设备 Xcode 10+

ios - 删除行 UICollectionView 中的空格

ios - 如何在 Swift 中将 ALAsset 转换为 NSData?