Constantly getting this error: Thread 1: EXC_BAD_INSTRUCTION(code=EXC_l386_INVOP,subcode=0x0)

Constantly getting this error: Thread 1: EXC_BAD_INSTRUCTION(code=EXC_l386_INVOP,subcode=0x0)

我经常遇到此错误,我真的不知道为什么,因为该应用程序相当简单,而且我是在 YouTube 上的教程基础上构建的,似乎一切正常。 (本教程是在 Swift 2 中编写的,但是我已经在使用 Swift 3)有人可以帮助我吗?


import UIKit

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {


    @IBOutlet var image1: UIImageView!

    @IBOutlet var image2: UIImageView!

    @IBOutlet var label1: UILabel!

    @IBOutlet var label2: UILabel!

    @IBOutlet var message: UILabel!

    var data = [["USA", "Italy", "China", "England"], ["Beijing", "London", "Rome", "Washington, DC"] ]

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func numberOfComponents(in pickerView: UIPickerView) -> Int {

        return data.count // Based on data. No hardcoded number.
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {

        return data[component].count

        // For each component (we have 2 components in our array -> the two elements (Countries = USA, Italy, China, England & Capitals = Beijing, London, Rome, Washington) grab the count for the row.

    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return data[component][row]
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

        let item1 = data[0][pickerView.selectedRow(inComponent: 0)]
        let item2 = data[1][pickerView.selectedRow(inComponent: 1)]

        print(item1)
        print(item2)

        // Grab whatever is selected in index [0] or index [1] into "selectedRow" contrast each other and compare if country and capital match each other.

        // Now we refer to the images so that we don't have to type in the exact name over and over again. 

        let usa = UIImage(named: "USA.png")
        let italy = UIImage(named: "Italy.jpeg")
        let china = UIImage(named: "China.jpeg")
        let england = UIImage(named: "England.jpeg")

        let washington = UIImage(named: "Washington.jpeg")
        let rome = UIImage(named: "Rome.jpeg")
        let beijing = UIImage(named: "Beijing.jpeg")
        let london = UIImage(named: "London.jpeg")

        let correctMessage = "The Capital of \(item1) is \(item2)"
        let wrongMessage = "Match the flags to the Capitals."


        switch item1 {

            case "USA":

                image1.image = usa
                label1.text = "USA"

            case "Italy":

                image1.image = italy
                label1.text = "Italy"

            case "China":

                image1.image = china
                label1.text = "China"

            case "England":

                image1.image = england
                label1.text = "England"

        default:
                image1.image = usa
                label1.text = "USA"

        } // End Of Switch 1

        switch item2 {

            case "Beijing":

                image2.image = beijing
                label2.text = "Beijing"

                if label1.text == "China" {

                    message.text = correctMessage

                }

                else {

                    message.text = wrongMessage

            }

            case "London":

                image2.image = london
                label2.text = "London"

                if label1.text == "England" {

                    message.text = correctMessage

            }

                else {

                    message.text = wrongMessage

            }

            case "Rome":

                image2.image = rome
                label2.text = "Rome"

                if label1.text == "Italy" {

                    message.text = correctMessage

            }

                else {

                    message.text = wrongMessage

            }

            case "Washington, DC":

                image2.image = washington
                label2.text = "Washington, DC"

                if label1.text == "USA" {

                    message.text = correctMessage

            }

                else {

                    message.text = wrongMessage

            }

        default:
                image2.image = washington
                label2.text = "Washington, DC"

        } // End Of Switch 2




    } // End Of Did Select Row

}  // End Of ViewController | End Of App

我猜这次崩溃是因为您使用了隐式解包选项,即顶部的 ! 变量。这些是允许为 nil 的变量,但如果在 nil.

时访问会导致崩溃

首先,让应用程序在调试器中停止,这样您就可以看到是哪一行造成的。然后,确认您已在 Interface Builder 中正确连接所有内容。我的猜测是这些 @IBOutlet 变量中的一个或多个未正确连接。