6

一部のメソッドの引数リストが で終わるのはなぜnilですか? 特にコレクションクラスでこれに気づきました。たとえば、次のようになりNSSetます。

mySet = [NSSet setWithObjects:someData, aValue, aString, nil];

NSArray:

NSArray *objects = [NSArray arrayWithObjects:@"value1", @"value2", @"value3", nil];
4

2 に答える 2

13

これは、可変引数リストがどのように機能するかに関係しています ( va_list...パラメーターのように表示されます)。コードがリスト内のすべての値を抽出しようとするとき、いつ停止するかを知る必要があります (値の数がわからないため)。リストの末尾を「センチネル」と呼ばれる特別な値で示します。これは通常NULL. そうすれば、処理コードが で a に遭遇するnilva_list、最後に到達したことがわかります。を省略するとnil、奇妙なエラーが発生します。これは、コードがnil.

NULLこれは、C 文字列を-terminateしなければならない理由とよく似ています。

補足として、stringWithFormat:および同様の -style メソッドは、書式文字列に含まれる修飾子printfの数に基づいて必要なパラメーターの数を把握するため、センチネルを必要としません。%したがって、フォーマット文字列 を@"hello, %@"指定すると、% 修飾子が 1 つしかないため、余分な引数が 1 つだけ検索されます。

于 2010-03-19T14:30:42.717 に答える
4

Objective-C の可変個引数関数には、引数を提供する以外に、引数リストがいつ終了するかを判断する方法がありませんnil

于 2010-03-19T14:31:45.987 に答える