2

重複の可能性:
特定のココア メソッドのパラメーター リストが nil で終わるのはなぜですか?

そのようなメソッドを定義するとき、それらの変数引数の終わりを示すために nil/NULL/0 を配置するstringWithFormat:必要がありますが、そうする必要がないようにどのように実装されていますか?

4

1 に答える 1

11

stringWithFormat:フォーマット自体を使用して、必要な引数の数を把握するためです。

これを行う基本的な方法は 2 つあります (可変引数リストを処理します)。

まず、長さまたはフォーマット文字列のような引数の数を事前に通知する必要があります。これの例は次のとおりです。

int arr[] = {6, 3, 1, 4, 1, 5, 9};
//           ^
//           |
//           +--- number of elements following.

また:

NSString *message = [NSString stringWithFormat: @"Your age is %d", age];
//                                                            ^
//                                                            |
//                                 only one format element ---+

nil/NULL/02 番目は、末尾のyour などのセンチネル値です。

int arr[] = {3, 1, 4, 1, 5, 9, -1};
//                              ^
//                              |
//         marks end of data ---+

さて、明らかに、センチネル法は、実際のデータとセンチネル値を区別できる場合にのみ機能します (PI の桁はすべて 0 から 9 までの正の数であるため、上記の場合は簡単です)。

技術的には、それらを組み合わせることもできると思いますが (各グループにセンチネル値を持つグループの数など)、実際に使用されていることはあまりありません。

于 2012-04-08T02:56:45.363 に答える