2010-10-07 67 views
2

與NSLog如何獲取可變參數列表類似,我想創建自己的方法。使用va_list並獲取EXC_BAD_ACCESS

我有我的方法這樣聲明,但是當我嘗試訪問'args'變量時,我得到一個EXEC_BAD_ACCESS。我在這裏做得不正確的是什麼?

- (void)info:(NSString *)formatString, ... 
{ 
    va_list args; 
    va_start(args, formatString); 

    NSLog(@"formatString value: %@", formatString); 

    // The following line causes the EXEC_BAD_ACCESS 
    NSLog(@"args value: %@", args); 

    // This is what I'm trying to do: 
    NSLog(formatString, args); 

    va_end(args);    
} 

我下面從這個博客節「在可可的va_list」: http://cocoawithlove.com/2009/05/variable-argument-lists-in-cocoa.html

回答

6

有一對夫婦在你的代碼錯誤。首先,args不能按原樣直接打印。它是對幾個參數的引用,並試圖使用NSLog("%@")打印它將不起作用。您可以使用NSLogv()來打印它(例如NSLogv(format, args);)。

或者你可以做我想做的,並使用此功能:

void print (NSString *format, ...) { 
    va_list args; 
    va_start(args, format); 

    fputs([[[[NSString alloc] initWithFormat:format arguments:args] autorelease] UTF8String], stdout); 

    va_end(args); 
} 
+0

謝謝 - 我沒有意識到NSLogv是應該使用的。 – 2010-10-07 22:46:07

1

的「%@」格式的指令需要一個參數,它解釋爲一個Objective-C的對象,並將其發送的「說明」選擇。這需要返回一個打印的NSString。

所以你的代碼試圖執行'[args description]',但args不是Objective-C對象,它的類型是'va_list'。因此例外。

查看您的鏈接,「setContentByAppendingStrings:」的實現顯示瞭如何從va_list中獲取參數。

0

早晨小夥子們,

我剛剛遇到了非常相似的問題。下面是我在做什麼:

+ (void) l:(D3LogLevel)p_logLevel s:(NSString *)p_format, ... 
{ 
    if (p_logLevel >= logLevel) { 
     va_list v_args; 
     va_start(v_args, p_format); 
     NSLog(@"[%d] %@", p_logLevel, [NSString stringWithFormat:p_format, v_args]); 
     va_end(v_args); 
    } 
} 

其中,作爲DarkDust這裏已經準確地描述,使用v_args作爲一個Objective-C的對象時,它不是。這裏是罪魁禍首電話:

[NSString stringWithFormat:p_format, v_args] 

因此,修改採取的va_list:

[[NSString alloc] initWithFormat:p_format arguments:v_args] 

利用適當的方法initWithFormat其簽名是:

- (id)initWithFormat:(NSString *)format arguments:(va_list)argList 

我們可以看到,類型是正確的,一切都變得晶瑩剔透。全改寫的方法是:

+ (void) l:(D3LogLevel)p_logLevel s:(NSString *)p_format, ... 
{ 
    if (p_logLevel >= logLevel) { 
     va_list v_args; 
     va_start(v_args, p_format); 
     NSLog(@"[%d] %@", p_logLevel, [[NSString alloc] initWithFormat:p_format arguments:v_args]); 
     va_end(v_args); 
    } 
} 

它的作品就像一個魅力!