有効ではないSEL型変数にはnilとNULLのどちらを設定すべきか
有効ではないSEL型変数にはnilとNULLのどちらを設定すべきか、少々気になったので調べてみた*1。
NULLにするのが「伝統的」
『詳解 Objective-C 2.0 第3版』の08-02節「メッセージ送信の仕組み」(185ページ)には次のように書かれている。
Objective-Cのプログラマは、SEL型が具体的にどんな値を持つのかについて知っている必要はありません。詳細は処理系に依存します。ただし、SEL型の変数が有効なセレクタを値として持っていないことを表したい場合は、伝統的にNULLを使うことが多いようです。あるいは、(SEL)0という表現でもよいでしょう。
- 作者: 荻原剛志
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2011/12/28
- メディア: 大型本
- 購入: 14人 クリック: 98回
- この商品を含むブログ (18件) を見る
なるほど。有効ではないSEL型変数にはNULLか(SEL)0を設定するのが適切であるようだ。
SEL型の実体はC言語タイプの文字列
SEL型の詳細については『Dynamic Objective-C』が次の場所で詳しく解説している。
これらの部分で、SEL型が実はNULL文字で終わるC言語タイプの文字列であることが説明されている*2。このことからも、有効ではないSEL型変数に設定する値としてはNULLが適切であるといえるだろう。
- 作者: 木下誠
- 出版社/メーカー: ビー・エヌ・エヌ新社
- 発売日: 2009/03/27
- メディア: 単行本(ソフトカバー)
- 購入: 9人 クリック: 119回
- この商品を含むブログ (31件) を見る
『Dynamic Objective-C』は、単にObjective-Cの使い方を説明しているのではなく、Objective-Cという言語がどのようなつくりになっているのかというレベルで解説している。そのため、普段Objective-Cのコードを書く上で目にしない部分を扱うことも多く、読み解くのに少々苦労することもあるが、今回のような疑問を解く上では非常に参考になる1冊だ。手元に置いてはあるのだがまだきちんと読めていないので、そろそろじっくりと読み解いてみたい。
*1:nilとNULLはそれぞれ以下のように定義されているので、実質的には同じような気もするのだが……。
#define NULL ((void*)0)
#define nil NULL
*2:今回初めて知った。自分はまだまだObjective-Cの奥深さを知らずにいるのだと改めて自覚した。