0について

Objective-Cにおいて0は特別な扱いをされているので,まとめておこうと思う.


この記事において,変数に格納されているものを値と呼ぶ.
さらに以下のコードでf()が実行される値をSuccessといい,g()が実行される値をFailureということにする

if (boolean) {
    f()
} else {
    g()
}

すべての変数は値で表されている

コンピュータは,1か0しか扱うことができない.これを8つのビット列をまとめたものをバイトと呼び,さらに,複数のバイト列をまとめたものをintやdoubleとして使っている.intやdoubleの型を決めてメモリを確保したものが変数である.つまり,これらの変数はすべて0か1の列で表されている.
 値は,型が違っていても同じ物を表すときがある.たとえば,intが4バイトである場合のintの-1とunsigned intの4294967295は同じ値として扱われる.ポインタも同様にメモリ空間の上のアドレスを表しており,どうように値として扱われている.ポインタ同士を==できないのはこのためである(NSString*のリテラル同士を比較した場合などでtrueを返す場合はある).

0はFailureである唯一の値である

0以外の値はすべてSuccessであるとも言える.intの-1はもちろんNilでないポインタもSuccussである.コンピューターにはintの-1もunsigned intの4294967295も同じ値として扱わるため,0か否かによって判定されている.

nilNilとNULLとfalseとNOはすべて0の値である

それぞれ型が違うだけで同じ値である.Failureとして扱うことができます.falseの型はコンパイラによります.

名前
Class nil,Nil
void* NULL
0 false
BOOL NO

ここで言いたいのは値が0であることなので,使い所が違いについて詳しくはこちらを参照してください.[NSNull null]の値は0ではありません

0は何もしないインスタンスとして扱うことができる

0はあらゆるのメッセージを送っても何もしないことが保証されている.これは,複数回releaseをしないためである.ARCが導入以前にreleaseの直後にnilを代入していたのは,このためである.nilに対してメッセージを送っても何もしないことが保証されているので,メッセージを送る際にnilチェックは必要としない.ただし,戻り値がある場合は,大抵の場合は0を返すが保証はされていないので,nilチェックを必要とする.

まとめ

Objective-Cの特性を理解することでより短く,効率のよいコードを書きたいですね.
”0はFailureである唯一の値である”ことだけでも覚えておいてください.