Effective Objective-C 2.0 読書メモ #21

2015年10月23日金曜日

前回: Effective Objective-C 2.0 読書メモ #20

Item 21: Understand the Objective-C Error Model

前回はプライベートメソッドにはプリフィックスをつける(ただし_はAppleのものと被って事故るので避けるように)という話でした。
今回はObjCのエラー処理モデルを理解するという話です。

例外処理機構について

  • ObjCにも例外機構は存在するが、基本的に復帰不可能・即終了のパターンでのみ使うべき
    • ARCの標準状態は例外セーフではないのでメモリリークを発生させうる
    • -fobjc-arc-exceptionsフラグをつけてコンパイルすることでこれは回避できるが、これをつけると正常コードパスでも余分なコード実行が必要になる
    • リソースの解放前に@throwをおこなうとリソース解放コードは呼び出されない
  • 例外を効果的に使えるケース
    • サブクラス実装の強要: サブクラスで必ずオーバーライドすべきメソッドをオーバーライドしなかった際の親クラス実装で例外を吐き、実装漏れをすぐに認識できるようにする
      • abstractの言語サポートがないので有用という話

例外以外のエラー処理の方法

  • デリゲートメソッドでエラーを受け取れるようにする
    • こうするとエラー情報を処理するかどうかの決定をユーザに委ねられるので例外利用よりだいぶよい
  • メソッドからの戻り値を0nilとしたり、NSErrorを使ったりする
    • NSErrorを使う場合、メソッド自体はBOOLなどを返すようにする
    • NSErrorerror domain@error codeuser info という3つの情報を返せるので使い勝手がいい
  • ARC下では関数内でNSError**を作ってもautorelease対象となるため返せない
    • これでは困るので呼び出し側からNSError**を渡して関数内で値を突っ込む方針でいく
  • ライブラリの専用NSErrorを用意して区別つくようにしたり、ヘッダにコメントを書いたりするとなおよし
とてもすっきりな話だった。

0 件のコメント:

コメントを投稿