// Before
Item *item = [Item itemWithTarget:nil action:NULL];
// After
Item *item = [Item itemWithTarget:0 action:0];
多くのコンパイラではnilもNULLも内部的には0と等しい値になるため、上記のコードでも問題なく動いでしまいます。
私はデバッグ中やメソッドの動作確認を行う際にこのテクニックを活用しています。
ダークサイ度:★★★★☆
今回はかなりアウトローなテクニックであるため、ダークサイ度は星4つと高めに設定しました。
将来的にNULLやnilの仕様が変わる可能性も否めませんし、コンパイル時にエラーや警告が発生するようになる可能性もまた否定できません。なお、処理系によってはNULLの値が0以外になる場合もあるそうです。またC++利用時は0とnullptrが区別される点に注意する必要があります。加えて、C++利用時のnilはnullptrの別名として定義される場合があります。
C言語の仕様や文化・歴史をきちんと理解した上で活用する必要があります。
あくまでその場限りのハックとして利用するのが良いでしょう。書捨てのコードを書く際に最適なテクニックと言えます。