一部のメソッドの引数リストが で終わるのはなぜnil
ですか? 特にコレクションクラスでこれに気づきました。たとえば、次のようになりNSSet
ます。
mySet = [NSSet setWithObjects:someData, aValue, aString, nil];
とNSArray
:
NSArray *objects = [NSArray arrayWithObjects:@"value1", @"value2", @"value3", nil];
一部のメソッドの引数リストが で終わるのはなぜnil
ですか? 特にコレクションクラスでこれに気づきました。たとえば、次のようになりNSSet
ます。
mySet = [NSSet setWithObjects:someData, aValue, aString, nil];
とNSArray
:
NSArray *objects = [NSArray arrayWithObjects:@"value1", @"value2", @"value3", nil];
これは、可変引数リストがどのように機能するかに関係しています ( va_list
、...
パラメーターのように表示されます)。コードがリスト内のすべての値を抽出しようとするとき、いつ停止するかを知る必要があります (値の数がわからないため)。リストの末尾を「センチネル」と呼ばれる特別な値で示します。これは通常NULL
. そうすれば、処理コードが で a に遭遇するnil
とva_list
、最後に到達したことがわかります。を省略するとnil
、奇妙なエラーが発生します。これは、コードがnil
.
NULL
これは、C 文字列を-terminateしなければならない理由とよく似ています。
補足として、stringWithFormat:
および同様の -style メソッドは、書式文字列に含まれる修飾子printf
の数に基づいて必要なパラメーターの数を把握するため、センチネルを必要としません。%
したがって、フォーマット文字列 を@"hello, %@"
指定すると、% 修飾子が 1 つしかないため、余分な引数が 1 つだけ検索されます。
Objective-C の可変個引数関数には、引数を提供する以外に、引数リストがいつ終了するかを判断する方法がありませんnil
。