前回: Effective Objective-C 2.0 読書メモ #20
今回はObjCのエラー処理モデルを理解するという話です。
Item 21: Understand the Objective-C Error Model
前回はプライベートメソッドにはプリフィックスをつける(ただし_はAppleのものと被って事故るので避けるように)という話でした。今回はObjCのエラー処理モデルを理解するという話です。
例外処理機構について
- ObjCにも例外機構は存在するが、基本的に復帰不可能・即終了のパターンでのみ使うべき
- ARCの標準状態は例外セーフではないのでメモリリークを発生させうる
- -fobjc-arc-exceptionsフラグをつけてコンパイルすることでこれは回避できるが、これをつけると正常コードパスでも余分なコード実行が必要になる
- リソースの解放前に@throwをおこなうとリソース解放コードは呼び出されない
- 例外を効果的に使えるケース
- サブクラス実装の強要: サブクラスで必ずオーバーライドすべきメソッドをオーバーライドしなかった際の親クラス実装で例外を吐き、実装漏れをすぐに認識できるようにする
- abstractの言語サポートがないので有用という話
- サブクラス実装の強要: サブクラスで必ずオーバーライドすべきメソッドをオーバーライドしなかった際の親クラス実装で例外を吐き、実装漏れをすぐに認識できるようにする
例外以外のエラー処理の方法
- デリゲートメソッドでエラーを受け取れるようにする
- こうするとエラー情報を処理するかどうかの決定をユーザに委ねられるので例外利用よりだいぶよい
- メソッドからの戻り値を0やnilとしたり、NSErrorを使ったりする
- NSErrorを使う場合、メソッド自体はBOOLなどを返すようにする
- NSErrorはerror domain、@error code、user infoという3つの情報を返せるので使い勝手がいい
- ARC下では関数内でNSError**を作ってもautorelease対象となるため返せない
- これでは困るので呼び出し側からNSError**を渡して関数内で値を突っ込む方針でいく
- ライブラリの専用NSErrorを用意して区別つくようにしたり、ヘッダにコメントを書いたりするとなおよし
0 件のコメント:
コメントを投稿