Objective-Cでnilにメッセージを送るとは

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Objective-Cには他の言語と比べて意外な仕様があります。その中でも一際目立つ、nil へのメッセージ送信について触れたいと思います。

Java などのクラスのインスタンスのメソッドを呼び出すことを、
Objective-C ではレシーバにメッセージを送信すると表現します。

記法としては Java などの instance.method() が Objective-C では [instace method] となります。

Objective-C では NULL オブジェクトを nil と定義しています。

この nil をレシーバとしてメッセージを投げても、 Java のように NullPointerException が発生することはありません。平たく言えば無視されます。戻り値のあるメソッド(メッセージ)に関しては0が返ります。

つまり、

Foo *foo = nil;
[foo method];

としてもエラーになることはないので、
Java のありがちな null チェックのように

if (foo != nil) {
    [foo method];
}

と書く必要はなく、単に [foo merthod] のみ で良いのです。

ガベージコレクションで管理されている言語の場合は、変数を参照するときにその参照先が既に破棄されていることは基本的にありません。しかし、iOS における Objective-C ではメモリの確保と参照と破棄を見通し良くしておくコーディングしておく必要があります。

[foo release];
foo = nil;

NSObject クラスの dealloc メソッド内以外は、上記のように解放したら nil をセットするようにしておくと良いでしょう。