Error: Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) Swift Bug

Hello,

I Have a bug with Swift on XCode and I don't understand what is this.

Here's the Error I have:

import UIKit
class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
  
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }
  
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return écoleNiveau.count
    }
  
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return écoleNiveau[row]
    }
  
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        ÉcoleNiveau.text = écoleNiveau[row]
    }
  
    var écoleNiveau = ["CFER 1 [CFER Des Navigateurs]", "CFER 2 [CFER Des Navigateurs]", "CFER 3 [CFER Des Navigateurs]", "FMS [CFER Des Navigateurs]"]
    @IBOutlet weak var cfer_J5_P4: UILabel!
    @IBOutlet weak var cfer_J5_P3: UILabel!
    @IBOutlet weak var cfer_J5_P2: UILabel!
    @IBOutlet weak var cfer_J5_P1: UILabel!
    @IBOutlet weak var cfer_J4_P4: UILabel!
    @IBOutlet weak var cfer_J4_P3: UILabel!
    @IBOutlet weak var cfer_J4_P2: UILabel!
    @IBOutlet weak var cfer_J4_P1: UILabel!
    @IBOutlet weak var cfer_J3_P4: UILabel!
    @IBOutlet weak var cfer_J3_P3: UILabel!
    @IBOutlet weak var cfer_J3_P2: UILabel!
    @IBOutlet weak var cfer_J3_P1: UILabel!
    @IBOutlet weak var cfer_J2_P4: UILabel!
    @IBOutlet weak var cfer_J2_P3: UILabel!
    @IBOutlet weak var cfer_J2_P2: UILabel!
    @IBOutlet weak var cfer_J2_P1: UILabel!
    @IBOutlet weak var cfer_J1_P4: UILabel!
    @IBOutlet weak var cfer_J1_P3: UILabel!
    @IBOutlet weak var cfer_J1_P2: UILabel!
    @IBOutlet weak var cfer_J1_P1: UILabel!
    @IBOutlet weak var ÉcoleNiveau: UITextField!
    @IBOutlet weak var PickerView: UIPickerView!
  
    @IBAction func horaireCFER1(_ sender: Any) {
        if ÉcoleNiveau.text == "CFER 1 [CFER Des Navigateurs]" {
            cfer_J1_P1.text = "Anglais"
            cfer_J1_P2.text = "Français"
            cfer_J1_P3.text = "Entreprise"
            cfer_J1_P4.text = "Math"
            cfer_J2_P1.text = "Entreprise"
            cfer_J2_P2.text = "Math"
            cfer_J2_P3.text = "Science"
            cfer_J2_P4.text = "Univers Social"
            cfer_J3_P1.text = "Math"
            cfer_J3_P2.text = "Français"
            cfer_J3_P3.text = "PMT"
            cfer_J3_P4.text = "Entrepris"
            cfer_J4_P1.text = "APS"
            cfer_J4_P2.text = "Univers Social"
            cfer_J4_P3.text = "Entreprise"
            cfer_J4_P4.text = "PMT"
            cfer_J5_P1.text = "Entreprise"
            cfer_J5_P2.text = "Anglais"
            cfer_J5_P3.text = "Science"
            cfer_J5_P4.text = "Éduc"
        }
    }
  
  
  
    override func viewDidLoad() {
        super.viewDidLoad()
        /
        PickerView.delegate = self //Here's the error: Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
        PickerView.dataSource = self
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        /
    }
  
}


Thanks for your future help


- Phil

Phil,


most likely, PickerView IBOutlet connection is missing or wrong.

A frequent reaso is you have changed the name of PickerView without rebuilding the connection.


To correct :

1. In IB, select the picker and open the connection inspector (the last button on right of the Inspectors panel)

You should see a referencing outlet.

2. click on the tiny x at the left of the name, to clear it.

Note : here you can change the name safely

3. To make sure things will work later, do a build clean folder (option click in Project Menu -> Clean)

4. Connect again the UIPicker to its IBOutlet by control drag.


Test now if it works.


A few comments reading your code ; you should take care to make it easier to read and understand (that will help you in future maintenance):

- all var or methods should respect camelCase: start with a lowercase

So, PickerView should be renamed pickerView (if you do it, you need to redo the connections !, unless you renamed at step 2 above).

- var écoleNiveau is an array ; its name should be more explicit like niveauxEcoles (plural to see there are several)

- its name is in fact too close to ÉcoleNiveau

@IBOutlet weak var ÉcoleNiveau: UITextField!

You could rename this one as ecoleNiveauField (I have a practice to have field at the end of any textField outlet, to see immediately what it is)



Finally, instead of declaring the delegate and dataSource in code, you can do it in IB.

select the name pickerView in the navigator of the ViewController class (where all objects are listed)

control-drag to the viewController object (with the white square in yellow circle)

release mouse and select delegate in the popup

repeat to select datasource

Claude31,


I've follow the steps you writed for me and it continue to not working.


import UIKit
class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
   
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }
   
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return écoleNiveau.count
    }
   
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return écoleNiveau[row]
    }
   
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        écoleNiveauField.text = écoleNiveau[row]
    }
   
    var écoleNiveau = ["CFER 1 [CFER Des Navigateurs]", "CFER 2 [CFER Des Navigateurs]", "CFER 3 [CFER Des Navigateurs]", "FMS [CFER Des Navigateurs]"]
    @IBOutlet weak var cfer_J5_P4: UILabel!
    @IBOutlet weak var cfer_J5_P3: UILabel!
    @IBOutlet weak var cfer_J5_P2: UILabel!
    @IBOutlet weak var cfer_J5_P1: UILabel!
    @IBOutlet weak var cfer_J4_P4: UILabel!
    @IBOutlet weak var cfer_J4_P3: UILabel!
    @IBOutlet weak var cfer_J4_P2: UILabel!
    @IBOutlet weak var cfer_J4_P1: UILabel!
    @IBOutlet weak var cfer_J3_P4: UILabel!
    @IBOutlet weak var cfer_J3_P3: UILabel!
    @IBOutlet weak var cfer_J3_P2: UILabel!
    @IBOutlet weak var cfer_J3_P1: UILabel!
    @IBOutlet weak var cfer_J2_P4: UILabel!
    @IBOutlet weak var cfer_J2_P3: UILabel!
    @IBOutlet weak var cfer_J2_P2: UILabel!
    @IBOutlet weak var cfer_J2_P1: UILabel!
    @IBOutlet weak var cfer_J1_P4: UILabel!
    @IBOutlet weak var cfer_J1_P3: UILabel!
    @IBOutlet weak var cfer_J1_P2: UILabel!
    @IBOutlet weak var cfer_J1_P1: UILabel!
    @IBOutlet weak var écoleNiveauField: UITextField!
    @IBOutlet weak var pickerView1: UIPickerView!
   
    @IBAction func horaireCFER1(_ sender: Any) {
        if écoleNiveauField.text == "CFER 1 [CFER Des Navigateurs]" {
            cfer_J1_P1.text = "Anglais"
            cfer_J1_P2.text = "Français"
            cfer_J1_P3.text = "Entreprise"
            cfer_J1_P4.text = "Math"
            cfer_J2_P1.text = "Entreprise"
            cfer_J2_P2.text = "Math"
            cfer_J2_P3.text = "Science"
            cfer_J2_P4.text = "Univers Social"
            cfer_J3_P1.text = "Math"
            cfer_J3_P2.text = "Français"
            cfer_J3_P3.text = "PMT"
            cfer_J3_P4.text = "Entrepris"
            cfer_J4_P1.text = "APS"
            cfer_J4_P2.text = "Univers Social"
            cfer_J4_P3.text = "Entreprise"
            cfer_J4_P4.text = "PMT"
            cfer_J5_P1.text = "Entreprise"
            cfer_J5_P2.text = "Anglais"
            cfer_J5_P3.text = "Science"
            cfer_J5_P4.text = "Éduc"
        }
    }
   
   
    override func viewDidLoad() {
        super.viewDidLoad()
        /
        pickerView1.delegate = self
        pickerView1.dataSource = self
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        /
    }
   
}


What can I do to fix it?


Thank you for your help 🙂


- Phil

Assuming the connections are correct, I do not see anything wrong.


I tested (XCode 8.3) both the code of original post and code of your last post, deleting some IBOutlets not related to picker, as well as @IBAction func horaireCFER1(_ sender: Any).


It works perfectly.


Which version of XCode do you run ?


import UIKit

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {

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

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return écoleNiveau.count
    }

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

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        écoleNiveauField.text = écoleNiveau[row]
    }

    var écoleNiveau = ["CFER 1 [CFER Des Navigateurs]", "CFER 2 [CFER Des Navigateurs]", "CFER 3 [CFER Des Navigateurs]", "FMS [CFER Des Navigateurs]"]
    @IBOutlet weak var écoleNiveauField: UITextField!
    @IBOutlet weak var pickerView1: UIPickerView!

    override func viewDidLoad() {
        super.viewDidLoad()

        pickerView1.delegate = self
        pickerView1.dataSource = self
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()

    }
}


Could you test also by deleting all the IBOutlets except écoleNiveauField and pickerView1 (you can comment them with //) ; you need also to delete the connections in IB to the deleted IBOutlets.



A last idea: could you test pickerView1

    override func viewDidLoad() {
        super.viewDidLoad()
        print("pickerView1 ",pickerView1)
        pickerView1.delegate = self
        pickerView1.dataSource = self
    }


What do you get ?

Have you a detailed crash report ?

For your questions, I'm on xCode 9, the error on the console is self = (Agenda_CFER.ViewController) 0x00007fc105800600 and I think it's because I've two Views Controllers in ViewController.swift .


Here's a picture in the Main.storyboard : https://img11.hostingpics.net/pics/588869Capturedcran20171009110741.png

I wait how to fix it... :)

What do you mean :

I've two Views Controllers in ViewController.swift

That does not appear in the code you have posted.


Would you mind showing the complete ViewController.swift

It’s complete, all the lines of codes are here. The two views controllers are in the script. When I touch the button "Horaire de la semaine" (to view the second view controller) in the simulator, the app stop to work. The error is because it, I think, but I don’t know. :) ;)

Sorry, but I do not see the 2 view controllers.

Which script ?


Please, be as clear as possible, it is a bit difficult to guess in another's code.

Here's the second View Controller code:

    @IBOutlet weak var cfer_J5_P4: UILabel!  
    @IBOutlet weak var cfer_J5_P3: UILabel!  
    @IBOutlet weak var cfer_J5_P2: UILabel!  
    @IBOutlet weak var cfer_J5_P1: UILabel!  
    @IBOutlet weak var cfer_J4_P4: UILabel!  
    @IBOutlet weak var cfer_J4_P3: UILabel!  
    @IBOutlet weak var cfer_J4_P2: UILabel!  
    @IBOutlet weak var cfer_J4_P1: UILabel!  
    @IBOutlet weak var cfer_J3_P4: UILabel!  
    @IBOutlet weak var cfer_J3_P3: UILabel!  
    @IBOutlet weak var cfer_J3_P2: UILabel!  
    @IBOutlet weak var cfer_J3_P1: UILabel!  
    @IBOutlet weak var cfer_J2_P4: UILabel!  
    @IBOutlet weak var cfer_J2_P3: UILabel!  
    @IBOutlet weak var cfer_J2_P2: UILabel!  
    @IBOutlet weak var cfer_J2_P1: UILabel!  
    @IBOutlet weak var cfer_J1_P4: UILabel!  
    @IBOutlet weak var cfer_J1_P3: UILabel!  
    @IBOutlet weak var cfer_J1_P2: UILabel!    
    @IBOutlet weak var cfer_J1_P1: UILabel!  
    @IBOutlet weak var écoleNiveauField: UITextField! //not in the second vc 
    @IBOutlet weak var pickerView1: UIPickerView!  //not in the second vc
// horaireCFER1 and écoleNiveauField.text is in the first vc     
    @IBAction func horaireCFER1(_ sender: Any) {  
        if écoleNiveauField.text == "CFER 1 [CFER Des Navigateurs]" {  
            cfer_J1_P1.text = "Anglais"  
            cfer_J1_P2.text = "Français"  
            cfer_J1_P3.text = "Entreprise"  
            cfer_J1_P4.text = "Math"  
            cfer_J2_P1.text = "Entreprise"  
            cfer_J2_P2.text = "Math"  
            cfer_J2_P3.text = "Science"  
            cfer_J2_P4.text = "Univers Social"  
            cfer_J3_P1.text = "Math"  
            cfer_J3_P2.text = "Français"  
            cfer_J3_P3.text = "PMT"  
            cfer_J3_P4.text = "Entrepris"  
            cfer_J4_P1.text = "APS"  
            cfer_J4_P2.text = "Univers Social"  
            cfer_J4_P3.text = "Entreprise"  
            cfer_J4_P4.text = "PMT"  
            cfer_J5_P1.text = "Entreprise"  
            cfer_J5_P2.text = "Anglais"  
            cfer_J5_P3.text = "Science"  
            cfer_J5_P4.text = "Éduc"  
        }  
    } 

Is it a new class ? Or insidde ViewController class (seems impossible because there is an IBAction (IBAction func horaireCFER1) with the same signature)


I just don't understand what do you mean :

"I've two Views Controllers in ViewController.swift"


This code is exactly the same as the first.


So, as long as you just post small pieces, it is impossible to understand what you are doing and what is the problem.

In the App, when I'm in the "Main Menu" View Controller, I touch the button "Horaire de la semaine", normally is going to another View Controller called "Agenda" (I do it in the simulator). But, the app crash when I touch the button "Horaire de la semaine" and the error "EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)" happen.


Here's a screenshot of my xCode project:

https://img11.hostingpics.net/pics/588869Capturedcran20171009110741.png


My project if you want to test:

https://drive.google.com/open?id=0B6zQ6VlHML5SWlhCYS1iYnpsZm8


Thank you for your help


- Philippe

Hello Claude31.

I am getting the same error as Phil007: Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

I am trying to setup a soundboard using the XCode 9 beta.

My view controller is as follows:


import UIKit
import AVFoundation
class ViewController: UIViewController {
   
    let soundFilenames = ["woo","liquor"]
    var audioPlayers = [AVAudioPlayer]()
    override func viewDidLoad() {
        super.viewDidLoad()
        /
       
        /
        for sound in soundFilenames {
            do {
                /
                let url = URL(fileURLWithPath: Bundle.main.path(forResource: sound, ofType: "mp3")!)
               
                let audioPlayer = try AVAudioPlayer(contentsOf: url)
                audioPlayers.append(audioPlayer)
            }
            catch {
                /
                audioPlayers.append(AVAudioPlayer())
            }
           
        }
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        /
    }
   
    @IBAction func buttonTapped(_ sender: UIButton) {
        /
        let audioPlayer = audioPlayers[sender.tag]
        audioPlayer.play()
    }
   
}


woo.mp3 and liquor.mp3 are in a folder named sounds.


Thanks so much for any help!

The problem continue.


Here's the code:

import UIKit
class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
   
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }
   
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return écoleNiveau.count
    }
   
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return écoleNiveau[row]
    }
   
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        écoleNiveauField.text = écoleNiveau[row]
    }
   
    var écoleNiveau = ["CFER 1 [CFER Des Navigateurs]", "CFER 2 [CFER Des Navigateurs]", "CFER 3 [CFER Des Navigateurs]", "FMS [CFER Des Navigateurs]"]
    @IBOutlet weak var cfer_J5_P4: UILabel!
    @IBOutlet weak var cfer_J5_P3: UILabel!
    @IBOutlet weak var cfer_J5_P2: UILabel!
    @IBOutlet weak var cfer_J5_P1: UILabel!
    @IBOutlet weak var cfer_J4_P4: UILabel!
    @IBOutlet weak var cfer_J4_P3: UILabel!
    @IBOutlet weak var cfer_J4_P2: UILabel!
    @IBOutlet weak var cfer_J4_P1: UILabel!
    @IBOutlet weak var cfer_J3_P4: UILabel!
    @IBOutlet weak var cfer_J3_P3: UILabel!
    @IBOutlet weak var cfer_J3_P2: UILabel!
    @IBOutlet weak var cfer_J3_P1: UILabel!
    @IBOutlet weak var cfer_J2_P4: UILabel!
    @IBOutlet weak var cfer_J2_P3: UILabel!
    @IBOutlet weak var cfer_J2_P2: UILabel!
    @IBOutlet weak var cfer_J2_P1: UILabel!
    @IBOutlet weak var cfer_J1_P4: UILabel!
    @IBOutlet weak var cfer_J1_P3: UILabel!
    @IBOutlet weak var cfer_J1_P2: UILabel!
    @IBOutlet weak var cfer_J1_P1: UILabel!
    @IBOutlet weak var écoleNiveauField: UITextField!
    @IBOutlet weak var pickerView1: UIPickerView!
   
    @IBAction func horaireCFER1(_ sender: Any) {
        if écoleNiveauField.text == "CFER 1 [CFER Des Navigateurs]" {
            cfer_J1_P1.text = "Anglais"
            cfer_J1_P2.text = "Français"
            cfer_J1_P3.text = "Entreprise"
            cfer_J1_P4.text = "Math"
            cfer_J2_P1.text = "Entreprise"
            cfer_J2_P2.text = "Math"
            cfer_J2_P3.text = "Science"
            cfer_J2_P4.text = "Univers Social"
            cfer_J3_P1.text = "Math"
            cfer_J3_P2.text = "Français"
            cfer_J3_P3.text = "PMT"
            cfer_J3_P4.text = "Entrepris"
            cfer_J4_P1.text = "APS"
            cfer_J4_P2.text = "Univers Social"
            cfer_J4_P3.text = "Entreprise"
            cfer_J4_P4.text = "PMT"
            cfer_J5_P1.text = "Entreprise"
            cfer_J5_P2.text = "Anglais"
            cfer_J5_P3.text = "Science"
            cfer_J5_P4.text = "Éduc"
        }
    }
   
   
    override func viewDidLoad() {
        super.viewDidLoad()
        /
        pickerView1.delegate = self //Here's the error: Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
        pickerView1.dataSource = self
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        /
    }
   
}



In the App, when I'm in the "Main Menu" View Controller, I touch the button "Horaire de la semaine", normally is going to another View Controller called "Agenda" (I do it in the simulator). But, the app crash when I touch the button "Horaire de la semaine" and the error "EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)" happen.


Here's a screenshot of my xCode project:

https://img11.hostingpics.net/pics/588869Capturedcran20171009110741.png


My project if you want to test:

https://drive.google.com/open?id=0B6zQ6VlHML5SWlhCYS1iYnpsZm8


Thank you for your help


(Yes, I have copy-paste precedent posts to be clear)


- Philippe

It would be easier if you opened a new thread with this. Because the cause may be different, even if the same error message.


Where do you get the error (which line) ?

Error: Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) Swift Bug
 
 
Q