甘いものが好きです

iOS App開発時に感じた疑問や課題、その他の雑感などを書いていきます。

有効ではないSEL型変数にはnilとNULLのどちらを設定すべきか

有効ではないSEL型変数にはnilとNULLのどちらを設定すべきか、少々気になったので調べてみた*1

NULLにするのが「伝統的」

『詳解 Objective-C 2.0 第3版』の08-02節「メッセージ送信の仕組み」(185ページ)には次のように書かれている。

Objective-Cプログラマは、SEL型が具体的にどんな値を持つのかについて知っている必要はありません。詳細は処理系に依存します。ただし、SEL型の変数が有効なセレクタを値として持っていないことを表したい場合は、伝統的にNULLを使うことが多いようです。あるいは、(SEL)0という表現でもよいでしょう。

詳解 Objective-C 2.0 第3版

詳解 Objective-C 2.0 第3版

なるほど。有効ではないSEL型変数にはNULLか(SEL)0を設定するのが適切であるようだ。

SEL型の実体はC言語タイプの文字列

SEL型の詳細については『Dynamic Objective-C』が次の場所で詳しく解説している。

  • Section 18「メソッドとは何か(1)—メソッド、セレクタ、メソッドの実装」(64ページ)
  • Section 21「メソッドとは何か(4)—セレクタの実体」(72ページ)

これらの部分で、SEL型が実はNULL文字で終わるC言語タイプの文字列であることが説明されている*2。このことからも、有効ではないSEL型変数に設定する値としてはNULLが適切であるといえるだろう。

Dynamic Objective-C

Dynamic Objective-C

『Dynamic Objective-C』は、単にObjective-Cの使い方を説明しているのではなく、Objective-Cという言語がどのようなつくりになっているのかというレベルで解説している。そのため、普段Objective-Cのコードを書く上で目にしない部分を扱うことも多く、読み解くのに少々苦労することもあるが、今回のような疑問を解く上では非常に参考になる1冊だ。手元に置いてはあるのだがまだきちんと読めていないので、そろそろじっくりと読み解いてみたい。

*1:nilとNULLはそれぞれ以下のように定義されているので、実質的には同じような気もするのだが……。
#define NULL ((void*)0)
#define nil NULL

*2:今回初めて知った。自分はまだまだObjective-Cの奥深さを知らずにいるのだと改めて自覚した。