3

あるメソッド (functionOne) から別のメソッド (functionTwo) に可変引数リストを渡したいと思います。va_list の最初のパラメーターにアクセスできる方法で functionTwo の va_list をセットアップする方法を理解できなかったことを除いて、すべて正常に動作します。va_arg を使用すると、va_list の 2 番目のパラメーターに進みます。どうも。

- (void)functionOne:(NSString *)configFiles, ... {
    va_list args;
    va_start(args, configFiles);
    [self functionTwo:args];
    va_end(args);
}

- (void)functionTwo:(va_list)files {
    NSString *file;
    while ((file = va_arg(configFiles, NSString *))) {
        ...
    }
}
4

3 に答える 3

3

最初の可変引数は渡された引数ではありませんva_start– それはその直後のものです。functionTwo:文字列にアクセスしたい場合configFilesは、明示的に渡す必要があります。

于 2013-04-22T07:06:32.467 に答える
2

デバッグ目的で使用するソリューションは次のようなものです

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

    if (level < MXMLogLevelDebug) return;

    if(format == nil) return;

    va_list args, args_copy;
    va_start(args, format);
    va_copy(args_copy, args);
    va_end(args);

    NSString *logString = [[NSString alloc] initWithFormat:format
                                                  arguments:args_copy];

    NSString *funcCaller = @"";
    NSArray *syms = [NSThread  callStackSymbols];
    if ([syms count] > 1) {
        funcCaller = [syms objectAtIndex:1];
    }
    NSString *logMessage = [NSString stringWithFormat:@"%@ DEBUG: %@", funcCaller, logString];

    NSLog(@"%@",logMessage);


}

これが持つ可能性のある副作用は、引数にガードを追加して、NULL でないことを確認する必要があることです。

于 2014-06-19T17:27:55.123 に答える
2

Technical Q&A QA1405: Objective-C メソッドの可変引数 を参照してください。

可変引数を取るメソッドは、可変引数メソッドとして知られています。

Objective-C メソッドの実装は、C 関数のようなコードのブロックにすぎないことに注意してください。stdarg(3) マニュアル ページで説明されている可変引数マクロは、通常の関数と同じようにメソッドで機能します。

NSMutableArray インスタンスに nil で終わる引数リスト内のすべてのオブジェクトを追加する可変個引数メソッドを含む Objective-C カテゴリの例を次に示します。

#import <Cocoa/Cocoa.h>

@interface NSMutableArray (variadicMethodExample)

// This method takes a nil-terminated list of objects.
- (void)appendObjects:(id)firstObject, ...;

@end

@implementation NSMutableArray (variadicMethodExample)

- (void)appendObjects:(id)firstObject, ... {
    id eachObject;
    va_list argumentList;
    if (firstObject) // The first argument isn't part of the varargs list,
        {                                   // so we'll handle it separately.
      [self addObject: firstObject];
      // Start scanning for arguments after firstObject.
      va_start(argumentList, firstObject);
      while (eachObject = va_arg(argumentList, id)) // As many times as we can get an argument of type "id"
      [self addObject: eachObject]; // that isn't nil, add it to self's contents.
      va_end(argumentList);
    }
}

@end
于 2013-04-22T07:58:34.927 に答える