0

私はObjectiveCで可変個引数関数を作成するためにこのSOAnswerを参照しました。以下のような引数を渡してコードをテストしました。

[self logMessage:@"string: %@\n number: %@\n image: %@",
 @"asdf",
 [NSNumber numberWithInt:23],
 [UIImage imageNamed:@"local.png"]];

NSLog()でコードを編集しました。

- (void)logMessage:(NSString *)format, ... {

    va_list args;
    va_start(args, format);

    id arg = nil;
    int i = 1;
    NSLogv(format, args);
    while ((arg = va_arg(args,NSString *))) {

        NSLog(@"val: %d", i++);
        /// Do your thing with arg here
        //NSString *name = NSStringFromClass([arg class]);
        //NSLog(@"string: %@", name);
    }        
    va_end(args);
}

ただし、出力は次のとおりです。

2012-09-28 19:34:45.271 SIMO[2384:c07] string: asdf
 number: 23
 image: <UIImage: 0x8151f80>
2012-09-28 19:34:45.273 SIMO[2384:c07] val: 1
2012-09-28 19:34:45.273 SIMO[2384:c07] val: 2
2012-09-28 19:34:45.274 SIMO[2384:c07] val: 3
2012-09-28 19:34:45.274 SIMO[2384:c07] val: 4
2012-09-28 19:34:45.274 SIMO[2384:c07] val: 5
2012-09-28 19:34:45.275 SIMO[2384:c07] val: 6
2012-09-28 19:34:45.275 SIMO[2384:c07] val: 7
2012-09-28 19:34:45.276 SIMO[2384:c07] val: 8

これは、引数が8であることを示していますが、3つしか渡しませんでした(NSString、NSNumber、UIImage)概念を理解できません。

4

1 に答える 1

2

va_arg引数リストがいつ終了するかは本当にわかりません。使用しているアプローチでは、引数リストがのようにで終了することを想定していnilます+[NSArray arrayWithObjects:]

したがって、呼び出しを変更nilして引数リストの最後に追加するか、引数がいつ終了したかを知る他の方法を見つけてください(たとえば、printfクローンの場合、フォーマット文字列自体からフォーマット引数の数を知ることができます)。

于 2012-09-28T14:20:05.753 に答える