質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

9987閲覧

EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)と表示されアプリがクラッシュされてしまいます。

Cassini

総合スコア9

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2018/08/31 09:47

編集2018/09/01 09:27

前提・実現したいこと

Swift初学者です。
SwiftとMapkitを用いた、現在地をピンでつなげていく、軌跡プログラムをつくりたいと思っています。
そして、シュミレーターのFreeway driveをできるようにしたいと思ってます。
Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
というメッセージが出てしまい、コンパイルはできるものの、アプリがクラッシュしてしまいます。
教えていただきたいです。
よろしくお願い致します。

発生している問題・エラーメッセージ

Swift

1エラーメッセージ 2fatal error: unexpectedly found nil while unwrapping an Optional value 3

該当のソースコード

Swift

1 //最初からあるメソッド 2 override func viewDidLoad() { 3 super.viewDidLoad() 4 5 //デリゲート先に自分を設定する。 6 testManager.delegate = self 7 8 //位置情報の取得を開始する。 9 testManager.startUpdatingLocation() 10 11 //位置情報の利用許可を変更する画面をポップアップ表示する。 12 testManager.requestWhenInUseAuthorization() 13 14 //デリゲート先を自分に設定する。 15 testMapView.delegate = self 16 //↑ここでエラーメッセージ 17 18 } 19 20 21 22 //位置情報取得時の呼び出しメソッド 23 func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 24 25 for location in locations { 26 27 //中心座標 28 let center = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude) 29 30 //表示範囲 31 let span = MKCoordinateSpanMake(0.01, 0.01) 32 33 //中心座標と表示範囲をマップに登録する。 34 let region = MKCoordinateRegionMake(center, span) 35 testMapView.setRegion(region, animated:true) 36 37 if(annotation == nil) { 38 //初回はマップにピンを格納する。 39 annotation = MKPointAnnotation() 40 annotation.coordinate = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude) 41 testMapView.addAnnotation(annotation) 42 } else { 43 //2回目以降は移動前と後の座標間に直線を引く。 44 45 //始点と終点の座標 46 var lineLocation:[CLLocationCoordinate2D] = [CLLocationCoordinate2D(latitude: annotation.coordinate.latitude, longitude: annotation.coordinate.longitude), 47 CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude)] 48 49 //2点間に直線を描画する。 50 let line = MKPolyline(coordinates: &lineLocation, count: 2) 51 testMapView.add(line) 52 53 //ピンの位置を更新する。 54 annotation.coordinate = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude) 55 } 56 57 } 58 } 59 60

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

Swift 3.0.2
Xcode 8.2.1

コード全容を記述します。

Swift

1import UIKit 2import MapKit 3 4class ViewController: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate { 5 6 @IBOutlet weak var testMapView: MKMapView! 7 8 var testManager:CLLocationManager = CLLocationManager() 9 10 //アノテーション 11 var annotation:MKPointAnnotation! 12 13 //最初からあるメソッド 14 override func viewDidLoad() { 15 super.viewDidLoad() 16 17 //デリゲート先に自分を設定する。 18 testManager.delegate = self 19 20 //位置情報の取得を開始する。 21 testManager.startUpdatingLocation() 22 23 //位置情報の利用許可を変更する画面をポップアップ表示する。 24 testManager.requestWhenInUseAuthorization() 25 26 //デリゲート先を自分に設定する。 27 testMapView.delegate = self 28 29 } 30 31 32 33 //位置情報取得時の呼び出しメソッド 34 func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 35 36 for location in locations { 37 38 //中心座標 39 let center = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude) 40 41 //表示範囲 42 let span = MKCoordinateSpanMake(0.01, 0.01) 43 44 //中心座標と表示範囲をマップに登録する。 45 let region = MKCoordinateRegionMake(center, span) 46 testMapView.setRegion(region, animated:true) 47 48 if(annotation == nil) { 49 //初回はマップにピンを格納する。 50 annotation = MKPointAnnotation() 51 annotation.coordinate = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude) 52 testMapView.addAnnotation(annotation) 53 } else { 54 //2回目以降は移動前と後の座標間に直線を引く。 55 56 //始点と終点の座標 57 var lineLocation:[CLLocationCoordinate2D] = [CLLocationCoordinate2D(latitude: annotation.coordinate.latitude, longitude: annotation.coordinate.longitude), 58 CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude)] 59 60 //2点間に直線を描画する。 61 let line = MKPolyline(coordinates: &lineLocation, count: 2) 62 testMapView.add(line) 63 64 //ピンの位置を更新する。 65 annotation.coordinate = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude) 66 } 67 68 } 69 } 70 71 72 73 //描画メソッド実行時の呼び出しメソッド 74 func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer { 75 let testRender = MKPolylineRenderer(overlay: overlay) 76 77 //直線の幅を設定する。 78 testRender.lineWidth = 3 79 80 //直線の色を設定する。 81 testRender.strokeColor = UIColor.red 82 83 return testRender 84 } 85} 86 87

試したこと

swift

1import UIKit 2import MapKit 3 4class ViewController: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate { 5 6 @IBOutlet weak var testMapView: MKMapView? 7 8 var testManager:CLLocationManager = CLLocationManager() 9 10 //アノテーション 11 var annotation:MKPointAnnotation! 12 13 14 15 //最初からあるメソッド 16 override func viewDidLoad() { 17 super.viewDidLoad() 18 19 20 21 //デリゲート先に自分を設定する。 22 testManager.delegate = self 23 24 //位置情報の取得を開始する。 25 testManager.startUpdatingLocation() 26 27 //位置情報の利用許可を変更する画面をポップアップ表示する。 28 testManager.requestWhenInUseAuthorization() 29 30 print("testMapView:", testMapView) 31 32 //デリゲート先を自分に設定する。 33 testMapView?.delegate = self 34 35 } 36 37 38 39 //位置情報取得時の呼び出しメソッド 40 func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 41 42 for location in locations { 43 44 //中心座標 45 let center = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude) 46 47 //表示範囲 48 let span = MKCoordinateSpanMake(0.01, 0.01) 49 50 //中心座標と表示範囲をマップに登録する。 51 let region = MKCoordinateRegionMake(center, span) 52 testMapView?.setRegion(region, animated:true) 53 54 if(annotation == nil) { 55 //初回はマップにピンを格納する。 56 annotation = MKPointAnnotation() 57 annotation.coordinate = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude) 58 testMapView?.addAnnotation(annotation) 59 } else { 60 //2回目以降は移動前と後の座標間に直線を引く。 61 62 //始点と終点の座標 63 var lineLocation:[CLLocationCoordinate2D] = [CLLocationCoordinate2D(latitude: annotation.coordinate.latitude, longitude: annotation.coordinate.longitude), 64 CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude)] 65 66 //2点間に直線を描画する。 67 let line = MKPolyline(coordinates: &lineLocation, count: 2) 68 testMapView?.add(line) 69 70 //ピンの位置を更新する。 71 annotation.coordinate = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude) 72 } 73 74 } 75 } 76 77 78 79 //描画メソッド実行時の呼び出しメソッド 80 func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer { 81 let testRender = MKPolylineRenderer(overlay: overlay) 82 83 //直線の幅を設定する。 84 testRender.lineWidth = 3 85 86 //直線の色を設定する。 87 testRender.strokeColor = UIColor.red 88 89 return testRender 90 } 91} 92 93 94

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tomochika_Tomo

2018/08/31 15:11

「testMapView.delegate = self」でアプリがクラッシュしているのは確かですか??エラーメッセージの内容からnilが許容されない箇所にnilが渡されているためアプリがクラッシュしているかと思うのですが、「testMapView.delegate = self」ではおきなそうだなと。
guest

回答1

0

ベストアンサー

確認ですが、「@IBOutlet weak var testMapView: MKMapView!」はStoryBoardのオブジェクトと接続されていますか?
接続されていない場合、testMapViewがnilのためクラッシュしているのでは無いでしょうか?

イメージ説明

投稿2018/09/01 02:08

編集2018/09/01 09:44
Tomochika_Tomo

総合スコア166

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Cassini

2018/09/01 07:15

Tomochika様ありがとうございます。 只今、StoryBoard内のView Controllerを見ましたらMKMapViewとなっておりました。 ですが、やはり testMapView.delegate = selfのところでクラッシュしてしまいます。。 すみません。もし、nilのためにクラッシュしている場合はどのようにしたらいいのでしょうか?
退会済みユーザー

退会済みユーザー

2018/09/01 07:23

横から失礼します。興味があるので聞きたいのですが、 testMapView.delegate = selfの上に、 print(“testMapView:”, testMapView)と貼り付けて実行すると コンソールに何が出力されますか?
Tomochika_Tomo

2018/09/01 07:28

MKMapViewとなっているのは良いのですが、「testMapView」の変数がStoryBoard上のオブジェクトと正しく紐づいているかを確認して頂きたく。 StoryBoardと正しく紐付いているのならば、その箇所でnilにはならないかなーと。。。
Cassini

2018/09/01 08:00

tyobigorou様ありがとうございます。 print(“testMapView:”, testMapView)を貼り付けて実行したところ、Thread 1:EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP,subcode=0x0)とのエラーが出てしましました。。
退会済みユーザー

退会済みユーザー

2018/09/01 08:03

??コンソールに"testMapView:"の文字くらいは出力されると思うのですが…。
Tomochika_Tomo

2018/09/01 08:09

testMapViewの変数宣言でMKMapView!のように強制アンラップの宣言がされているので、nilの状態のものにアクセスしてしまい、落ちているのかなと
退会済みユーザー

退会済みユーザー

2018/09/01 08:22 編集

横入りしてごめんなさい、やり取りが煩雑になるので控えますね、 Tomochika_Tomoさんのおっしゃる通りだとおもいますよ。というか他に手がない。 ただ、そこがnilなら、print(“testMapView:”, testMapView)をエラー行の上に貼り付けて実行すると、コンソールに、testMapView: nilって出るはずなんですよね。
Cassini

2018/09/01 09:18

Tomochika様たびたびありがとうございます。 自分なりにオプショナル型に変更してみたのですが、コンパイルはできたのですが、日本が表示されるマップしか表示されないようになりました。。。 「testMapView」の変数がStoryBoard上のオブジェクトと正しく紐づいているかを確認する方法を教えていただけると助かります。。 tyobigorou様たびたびありがとうございます。 @IBOutlet weak var testMapView: MKMapView!を @IBOutlet weak var testMapView: MKMapView?にしてからprint(“testMapView:”, testMapView)を入力したところ、おっしゃる通りコンソールにtestMapView:nilと表示されるようになりました。 ですが、さらにERROR /BuildRoot/Library/Caches/com.apple.xbs/Sources/VectorKit_Sim/VectorKit-1230.32.8.29.9/GeoGL/GeoGL/GLCoreContext.cpp 1763: InfoLog SolidRibbonShader: ERROR /BuildRoot/Library/Caches/com.apple.xbs/Sources/VectorKit_Sim/VectorKit-1230.32.8.29.9/GeoGL/GeoGL/GLCoreContext.cpp 1764: WARNING: Output of vertex shader 'v_gradient' not read by fragment shader と表示されているのですがこれはどういうことなんでしょうか....? 勉強し始めたばかりの本当の初心者でわからないことだらけですが、よろしくお願いいたします。。
Tomochika_Tomo

2018/09/01 09:46

最初の回答に画像を追加しました。 StoryBoardのファイルの「Test Map View」を選択して、「Referencing Outlets」の部分を確認して見てください。 ちゃんと紐付いていれば、追加した画像と同じように「testMapView」の変数名が表示されているはずです。
Cassini

2018/09/01 10:12

Tomochika様本当にありがとうございました。 Referencing Outletsの部分を確認したところ、ご指摘どおり紐づけされていませんでした。 そこを改善したところ正常に走らせることができました! わかりやすく的確なアドバイス、本当にありがとうございました。 これからもよろしくお願い致します。
退会済みユーザー

退会済みユーザー

2018/09/01 10:17

よかったですね、もし、@IBOutlet weak var testMapView: MKMapView?にしたままだったら ?を!に直しておいてください。
Cassini

2018/09/01 10:52

tyobigorou様本当にありがとうございました。 ?を!に直しました! 実は、独学のため一ヶ月考え込んでいたプログラムだったのでアドバイス本当に助かりました! まだまだ未熟者なのでプログラムをいろいろと教えていただけると本当にありがたいです。 これからもよろしくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問