大学生エンジニアの技術ブログ

Technical blog

Learn More
投稿日:2019年02月11日

【swift】UITableViewCellにてsignal SIGABRTがでた時のエラー解決方法

ゴール

XcodeでUITableViewCellをコードで設定した後、sumiraterで動かした時に生じた「signal SIGABRT」のエラーを解決する。

 

 

signal SIGABRTとは?

 

signal: 「信号」

sigabart:「信号の1つで、プログラムの異常終了を表わす。」

 

一言でいうと「エラーが発生している」ということ。原因は多岐に渡る。

 

よくあるパターンとしては「StoryBoardでOutlet接続したが、そのOutletが上手くリンクしていない」「配列で存在しない添字にアクセスしている」「オブジェクトがnilになっている」「コード修正前のキャッシュが残っている」などが考えられるそうだ。

 

 

今回のエラーの原因は?

では今回の「signal SIGABRT」がなぜ生じたのかという原因を考える。まず見るべき場所としてはconsoleLogである。Logを見るとエラーの原因っぽい内容が二箇所出力されていた。

 

ConsoleLogのエラー出力

「libc++abi.dylib: terminating with uncaught exception of type NSException」

+

「Terminating app due to uncaught exception ‘NSInternalInconsistencyException’, reason: ‘unable to dequeue a cell with identifier songCell – must register a nib or a class for the identifier or connect a prototype cell in a storyboard’」

 

NSExceptionとは?

Appleの公式サイトによるとNSExceptionは以下のように説明されている。

 

「An object that represents a special condition that interrupts the normal flow of program execution.」

 

日本語訳をすると

 

「プログラム実行の通常のフローを中断する特別な条件を表すオブジェクト」

とのこと。NSExceptionは一応オブジェクトなのね。意味的には処理を止めるエラーと考えてよさそう。

 

NSInternalInconsistencyExceptionとは?

先ほど同様、Appleの公式サイトによるとNSExceptionは以下のように説明されている。

 

「Name of an exception that occurs when an internal assertion fails and implies an unexpected condition within the called code.」

 

日本語訳をすると

 

「内部 assertion が失敗したときに発生し、呼び出されたコード内で予期しない状態を意味する例外の名前。」

 

assertionとは?

「プログラミング言語などの仕様・機能の一つで、プログラムの前提として満たされるべき条件を記述し、実行時にそれが満たされていない場合にエラーや例外を発生させたり、メッセージを表示して処理を中断したりする機能をアサーションチェックあるいは略してアサーションという。」とのこと。

 

NSInternalInconsistencyExceptionが発生した理由

「NSException」のエラー原因はConsoleには出力されていなかったが「NSInternalInconsistencyException」の原因らしき文章ががConsoleに書かれていた為まずこちらから解決することにした。エラー原因は以下の文章の内容だと考えられる。

 

「unable to dequeue a cell with identifier songCell – must register a nib or a class for the identifier or connect a prototype cell in a storyboard」

 

どうやらCellのclassを登録する処理を書き忘れているらしい。

 

以下のコードを追加し解決

 

のコードを「override func viewDidLoad() 」内に記述することで無事エラーが消えた。同時にNSExceptionのエラーも消えたため、NSExceptionの中にNSInternalInconsistencyExceptionが含まれており、今回のエラーはNSInternalInconsistencyExceptionのエラー原因を解決したことで、すべてのエラーを解消できたと考えられる。

     

 

参考サイト

最後まで読んで頂き
ありがとうございました。
SNS等でのシェアが頂ければ幸いです。

Created by KATUO - Copyright 2019