ios開発nilチェック、BOOLタイプトラップ

1671 ワード

Nil検査
論理フローの検証時にのみnilチェックを行います.
nilチェックを使用するのは、プログラムのクラッシュを防ぐためではなく、論理フローを検証します.空のオブジェクトにメッセージを送信するのは、Objective-Cランタイムによって処理されます.方法は結果を返さず、あなたも安心して歩けます.しかし、ここにも一つあります.
ここでC/C++の空のポインタチェックとはまったく異なり、それらの環境では、空のポインタの状況を処理せず、アプリケーションのクラッシュを引き起こす可能性があります.しかし、引き出しのポインタが空でないことを自分で確認してください.
BOOLタイプ罠
整形をBOOL型に変えるときは気をつけましょう.YESと直接比較しないでください.
BOOLはObjective-Cでunsignedcharと定義されているが,これはYES(1)とNO(0)の2つの値だけではないことを意味する.直接整形を強制的にBOOL型に変換しないでください.よくあるエラーは、配列サイズ、ポインタの値、または論理ビット演算の結果をBOOL型に割り当てることで発生しますが、これにより、BOOL値が以前の整形値の最後のバイトにのみ依存し、整形値が0ではなくNOに変換される可能性があります.これに応じて整形をBOOL型にする場合はterneryオペレータを使用し、YESまたはNOの値を返してください.
BOOLで、_BOOLとbool(C++Std 4.7.4,4.12およびC 99 Std 6.3.1.2を参照)の間で安全な交換値または転換が可能である.しかし、BOOLとBooleanの間にはいけないので、Booleanに対しては上記の整形のようにすればいいです.Objective-C関数署名ではBOOLのみ使用します.
BOOL値に論理演算(&,|,!)を使用いずれも有効で、戻り値もterneryオペレータを必要とせずにBOOL型に安全に移行できます.
コード#コード#
    // AVOID
      - (BOOL)isBold {
      return [self fontTraits] & NSFontBoldTrait;
      }
      - (BOOL)isValid {
      return [self stringValue];
      }
      // GOOD
      - (BOOL)isBold {
      return ([self fontTraits] & NSFontBoldTrait) ? YES : NO;
      }
      - (BOOL)isValid {
      return [self stringValue] != nil;
      }
      - (BOOL)isEnabled {
      return [self isValid] && [self isBold];
      }

また、BOOL型変数をYESと直接比較しない.これはCに精通している人にとって難しいだけでなく、この条項の第1点も、このようにして必ずしもあなたの望む結果を得ることができるとは限らないことを示しています.
コード#コード#
      // AVOID
      BOOL great = [foo isGreat];
      if (great == YES)
      // ...be great!
      // GOOD
      BOOL great = [foo isGreat];
      if (great)
      // ...be great!