🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Xcode

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

Swift

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

Q&A

解決済

2回答

11960閲覧

[swift 5]Thread 1: EXC_BAD_ACCESS (code=2, address=0x16cf07fe0)

Kaguya_4869

総合スコア117

Xcode

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

Swift

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

0グッド

0クリップ

投稿2019/11/30 06:27

編集2019/11/30 07:12

#質問したいこと
いつもお世話になっております。今回もまたメモ帳アプリを作っていたら
Thread 1: EXC_BAD_ACCESS (code=2, address=0x16cf07fe0)
というエラーが出てきました。調べてみたのですが、どこをどう直せばいいのかわからず、聞いてみた次第です。
#コード

swift

1//ホーム画面 2import UIKit 3 4 5class ViewController: UIViewController,UITableViewDataSource,UITableViewDelegate { 6 7 @IBOutlet weak var memoTableView: UITableView! 8 9 var image: UIImage! 10 var saveArray: Array = [NSData]() 11 var memoArray = [String]() 12 13 let ud = UserDefaults.standard 14 15 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 16 tableView.reloadData() 17 return memoArray.count 18 } 19 20 21 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 22 let cell = tableView.dequeueReusableCell(withIdentifier: "memoCell", for: indexPath) as! TableViewCell 23 cell.cellLabel.text = memoArray[indexPath.row] 24 25 tableView.reloadData() 26 27 return cell 28 } 29 30 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 31 self.performSegue(withIdentifier: "toDetail", sender: nil) 32 //押したら押した状態を解除 33 tableView.deselectRow(at: indexPath, animated: true) 34 } 35 36 37 38 39 override func viewDidLoad() { 40 super.viewDidLoad() 41 42 memoTableView.delegate = self 43 memoTableView.dataSource = self 44 45 memoTableView.reloadData() 46 } 47 48 49 50 51 override func viewWillAppear(_ animated: Bool) { 52 loadMemo() 53 } 54 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 55 //destinationのクラッシュ防ぐ 56 if segue.identifier == "toDetail"{ 57 //detailViewControllerを取得 58 //as! DetailViewControllerでダウンキャストしている 59 let detailViewController = segue.destination as! DetailViewController 60 //遷移前に選ばれているCellが取得できる 61 let selectedIndexPath = memoTableView.indexPathForSelectedRow! 62 detailViewController.selectedMemo = memoArray[selectedIndexPath.row] 63 detailViewController.selectedRow = selectedIndexPath.row 64 } 65 } 66 func loadMemo(){ 67 if ud.array(forKey: "memoArray") != nil{ 68 //取得 またas!でアンラップしているのでnilじゃない時のみ 69 memoArray = ud.array(forKey: "memoArray") as![String] 70 //reloadしてくれる 71 memoTableView.reloadData() 72 } 73 } 74 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { 75 76 //アラート表示 77// deleteShowAlert() 78 79 80 if editingStyle == .delete { 81 82 //resultArray内のindexPathのrow番目をremove(消去)する 83 memoArray.remove(at: indexPath.row) 84 85 //再びアプリ内に消去した配列を保存 86 ud.set(memoArray, forKey: "memoArray") 87 88 89 //tableViewを更新 90 memoTableView.reloadData() 91 } 92 } 93} 94

swift

1//ホーム画面のtableViewCell 2import UIKit 3 4 5 6class TableViewCell: UITableViewCell { 7 8 @IBOutlet weak var cellImage: UIImageView! 9 @IBOutlet weak var cellLabel: UILabel! 10 11 let uuid = NSUUID().uuidString 12 13 override func awakeFromNib() { 14 super.awakeFromNib() 15 16 let imageData:NSData = UserDefaults.standard.object(forKey: "saveImage") as! NSData 17 cellImage.image = UIImage(data: imageData as Data) 18 // Initialization code 19 } 20 21 override func setSelected(_ selected: Bool, animated: Bool) { 22 super.setSelected(selected, animated: animated) 23 24 // Configure the view for the selected state 25 } 26 27 //ここを追加 28 func fill(image: UIImageView, titleLb: String, date: String, siteName: String){ 29 cellImage.image = imageView?.image 30 31 } 32 33 // 追加 34 override func prepareForReuse() { 35 super.prepareForReuse() 36 cellImage.image = imageView?.image 37 38 } 39 40 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 41 let cell = tableView.dequeueReusableCell(withIdentifier: "tableViewCell", for: indexPath) as! TableViewCell 42 //画像を初期化 43 cellImage.image = nil 44 return cell 45 } 46 47 48} 49

#やってみたこと(追記)
https://teratail.com/questions/146787Swift次のコードでThread 1: EXC_BAD_ACCESS (code=2, address=0x110d75ea8)のエラーがでます。。
をみてみましたが、カスタムクラスが間違っているとうはありませんでした。
#エラー

error

1Thread 1: EXC_BAD_ACCESS (code=2, address=0x16cf07fe0)

#追記
ログの部分
ログ
エラーの部分
イメージ説明
至急よろしくお願いします。

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

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

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

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

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

popai306

2019/11/30 06:42

EXC_BAD_ACCESS系って自分の経験的に、xibファイルとコードの連携がうまくできてないときに出るメッセージな感じがしてます。 具体的にどのソースコードの行でEXC_BAD_ACCESSになってるかエラーメッセージからわかりますか?
Kaguya_4869

2019/11/30 06:50

早速ありがとうございます! エラーメッセージが(11db)としか書いていなくて、どうすればいいかわからない状態です。
popai306

2019/11/30 06:51

ログのところにフィルターかけてませんか?
Kaguya_4869

2019/11/30 06:56

フィルターかけてません。
Kaguya_4869

2019/11/30 06:57

写真追加してみました。
popai306

2019/11/30 07:05

上の画像のときに、ソースコード上でハイライトされてる行ってどこになります?
Kaguya_4869

2019/11/30 07:09

どこかよくわからないので、追記で画像のせておきました。
Kaguya_4869

2019/11/30 07:14

ViewControllerのViewdidLoadっぽいのでコードみてみましたが、 override func viewDidLoad() { super.viewDidLoad() memoTableView.delegate = self memoTableView.dataSource = self memoTableView.reloadData() } とかいてあります。
popai306

2019/11/30 07:14

ありがとうございます。 ViewDidLoadのタイミングですね
退会済みユーザー

退会済みユーザー

2019/11/30 07:18 編集

1:ViewControllerのsuper.viewDidLoad()の下に、print("memoTableView:" , memoTableView)と書くと、コンソールに何が出力されますか? 2: numberOfRowsInSectionのtableView.reloadData()をコメントアウトするとどうなりますか? 3: cellForRowAtが、カスタムセルの中にありますが、これでビルドできてますか? 取り敢えず1から一つずつ試してみてください
popai306

2019/11/30 07:18

ソースコードってどっかから拾って自分で修正した感じですか?
Kaguya_4869

2019/11/30 07:22

1:memoTableView: Optional(<UITableView: 0x1268c9000; frame = (0 88; 414 808); clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x28206fcc0>; layer = <CALayer: 0x282e2b860>; contentOffset: {0, 0}; contentSize: {0, 0}; adjustedContentInset: {0, 0, 0, 0}; dataSource: (null)>)が表示されます。 2:違うThread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional valueというエラーが出されます。tableViewCellの26行目 let imageData:NSData = UserDefaults.standard.object(forKey: "saveImage") as! NSData に問題があると言われています。 3:前までビルドできていました。 ソースコードは色々なサイトの物を組み合わせたりしています。
退会済みユーザー

退会済みユーザー

2019/11/30 07:29

2のコメントアウトで、エラーが変わったと言うことですか?
退会済みユーザー

退会済みユーザー

2019/11/30 07:37

コード読みました、私にはあなたが何をしたいか理解できないので、お役に立てないと思います。ごめんなさい。 そのエラーは、データがないか、キャストできないってことなので、安全にアンラップしてあげてください。 もう少し基礎的なところに戻って一つ一つ確実にこなしてみるのが良いと思います。
Kaguya_4869

2019/11/30 07:38

わざわざありがとうございます。
退会済みユーザー

退会済みユーザー

2019/11/30 07:54 編集

以前の質問に掲載されているtableViewのコードには、辺なところにreloadData()があったりしないので、画像を扱いたいためにカスタムセルでつまっているのかな? カスタムセルのUILabelに文字列を渡すだけのtableViewをつくってみてなれてみてはどうでしょうか? https://yuu.1000quu.com/use_a_custom_cell_in_swift
Kaguya_4869

2019/11/30 08:01

ありがとうございます。
guest

回答2

0

自己解決

コードを見直し、色々な部分をみてみたところ、ViewControllerのViewDidLoadにて
memoTableView.delegate = selfと
memoTableView.dataSource = self
をコメントアウトしてみたらうまく動きました。

ストーリーボードでも設定して、さらにコードでも設定してしまっていたことが原因かと思われます。

今回ご協力くださったみなさま、本当にありがとうございました。

swift

1//ホーム画面 2import UIKit 3 4class ViewController: UIViewController,UITableViewDataSource,UITableViewDelegate { 5 6 @IBOutlet weak var memoTableView: UITableView! 7 8 var memoArray = [String]() 9 10 let ud = UserDefaults.standard 11 12 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 13 return memoArray.count 14 } 15 16 17 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 18 let cell = tableView.dequeueReusableCell(withIdentifier: "memoCell", for: indexPath) 19 cell.textLabel?.text = memoArray[indexPath.row] 20 return cell 21 } 22 23 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 24 self.performSegue(withIdentifier: "toDetail", sender: nil) 25 //押したら押した状態を解除 26 tableView.deselectRow(at: indexPath, animated: true) 27 } 28 29 30 override func viewDidLoad() { 31 super.viewDidLoad() 32 33// memoTableView.delegate = self 34// memoTableView.dataSource = self 35 } 36 override func viewWillAppear(_ animated: Bool) { 37 loadMemo() 38 } 39 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 40 //destinationのクラッシュ防ぐ 41 if segue.identifier == "toDetail"{ 42 //detailViewControllerを取得 43 //as! DetailViewControllerでダウンキャストしている 44 let detailViewController = segue.destination as! DetailViewController 45 //遷移前に選ばれているCellが取得できる 46 let selectedIndexPath = memoTableView.indexPathForSelectedRow! 47 detailViewController.selectedMemo = memoArray[selectedIndexPath.row] 48 detailViewController.selectedRow = selectedIndexPath.row 49 } 50 } 51 func loadMemo(){ 52 if ud.array(forKey: "memoArray") != nil{ 53 //取得 またas!でアンラップしているのでnilじゃない時のみ 54 memoArray = ud.array(forKey: "memoArray") as![String] 55 //reloadしてくれる 56 memoTableView.reloadData() 57 } 58 } 59 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { 60 61 if editingStyle == .delete { 62 63 //resultArray内のindexPathのrow番目をremove(消去)する 64 memoArray.remove(at: indexPath.row) 65 66 //再びアプリ内に消去した配列を保存 67 ud.set(memoArray, forKey: "memoArray") 68 69 //tableViewを更新 70 tableView.reloadData() 71 } 72 } 73} 74

投稿2019/11/30 08:10

Kaguya_4869

総合スコア117

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

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

退会済みユーザー

退会済みユーザー

2019/11/30 08:25

memoTableView.delegate = self memoTableView.dataSource = self storyboardとコード相法から設定してもtableViewは動きます。 原因は他のところです。
guest

0

memoTableView.delegate = self
memoTableView.dataSource = self

storyboardとコード相法から設定してもtableViewは動きます。
原因は他のところです。

投稿2019/11/30 08:22

編集2019/11/30 08:25
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問