簡體   English   中英

當作為參數傳遞給Objective-C中的方法時,迭代va_list

[英]Iterating a va_list when passed as a parameter to a method in Objective-C

我想將一個變量參數列表從一個方法(functionOne)傳遞給另一個方法(functionTwo)。 一切正常,除了我無法弄清楚如何在functionTwo中設置va_list,我可以訪問va_list中的第一個參數。 使用va_arg前進到va_list中的第二個參數。 謝謝。

- (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 *))) {
        ...
    }
}

第一個可變參數不是傳遞給va_start的參數 - 它是緊隨其后的參數。 如果你想要functionTwo:有權訪問configFiles字符串,你需要明確地傳遞它。

請參閱技術問答QA1405:Objective-C方法中的變量參數

采用可變參數的方法稱為可變方法。

請記住,Objective-C方法的實現只是一個代碼塊,比如C函數。 stdarg(3)手冊頁中描述的可變參數宏在方法中的工作方式與在普通函數中的工作方式相同。

這是一個Objective-C類的示例,其中包含一個可變方法,該方法將nil終止的參數列表中的所有對象附加到NSMutableArray實例:

#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

我用於調試目的的解決方案就像

-(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);


}

這可能產生的副作用是你必須在args上添加一個保護,以確保不是NULL。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM