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か否かによって判定されている.
nilとNilと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である唯一の値である”ことだけでも覚えておいてください.