2013-04-23 3 views
2

객관적인 C 가변 인수 함수에 대한 명확한 아이디어가 없습니다. nlsog 형식의 매개 변수를 사용하는 함수를 작성하려고하지만 언젠가는 그 함수 내부에서 NSLog를 사용해야합니다. 어떻게해야합니까?가변 인수 함수 내 NSLog

-(void) printStatus:(NSString*)status, ... 
{ 
    // I want use use NSLog with all these parameter here. 

    // some gui logging also happens here 
} 

통화

[self printStatus:@"status"]; 

또는

대신 NSLog를 사용
[self printStatus:@"Staus: %@", someObject]; 

, 나는 printStatus를 사용하려면, 다음과 같이 될 것입니다. 콘솔 로깅을 GUI 로깅으로 전환해야 할 때 printStatus 함수 만 변경하여 코드 내의 모든 부분을 변경하지 않아도됩니다.

아니면 내가 여기에서 사용하고 같은 DLOG를 사용

,

#ifdef DEBUG 
# define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) 
#else 
# define DLog(...) /* */ 
#endif 

답변

6

형식의 문자열을 사용하여 알 수있는 바와 같이 유형과 매크로 NSLogv을 가변 인자 :

-(void)printStatus:(NSString*)status, ... 
{ 
    va_list args; 
    va_start(args, status); 
    NSLogv(status, args); 
    va_end(args); 
} 

이것은 status 인수는 인수 다음에 형식 문자열을 가정합니다.

당신은 당신이 NSLogv 이외에이 작업을 수행 할 수 있습니다 (귀하의 GUI를 업데이트 용) 서식 캐릭터 라인 및 인수에서 NSString을 만들려면 :

NSLogv(status, args); 
NSString *message = [[NSString alloc] initWithFormat:status arguments:args]; 
// ... log to GUI 
+0

. 하지만 NSLog를 사용하는 곳에서 DLog 매크로를 사용하고있었습니다. NSLog를 사용할 방법이 있습니까? #defdef DEBUG # define DLog (fmt, ...) NSLog ((@ "% s [행 % d]"fmt), __PRETTY_FUNCTION__, __LINE__, ## __ VA_ARGS__) #else # define DLog/* */ #endif – karim

+1

함수/메소드에서 변수 인수를 전달하는 유일한 방법은'va_list '를 사용하는 것입니다. 이것이 대부분의 라이브러리가'va_list '를 허용하는'* v' 대안을 제공하는 이유입니다. 그러므로'NSLogv'를 호출하는'DLogv' 파일을 생성하고 그 파일에 인수를 전달해야합니다. –

+0

감사. 제 2의 경우를 생각하고있었습니다. 그러나 나는 첫 번째 사건을 확신하지 못했습니다. 두 번째 경우에 문자열을 만들 때부터 va_start (args, status)를 호출해야합니다. 그렇지 않으면 argString이 NSString과 함께 사용되지 않습니다. 그거 아니야? – karim

-2

내가 정확히 질문을 이해 할 수 없습니다입니다. 난 당신이 당신이 C의 작업해야

[NSString stringWithFormat:@"this is string %@",@"String"]; 
+0

NSLog를 사용하는 대신 printStatus를 사용하고 싶습니다. 콘솔 로깅을 GUI 로깅으로 전환해야 할 때 printStatus 함수 만 변경하여 코드 내의 모든 부분을 변경하지 않아도됩니다. 덕분에 – karim

1

마지막으로, 관심있는 사람들을 위해, 여기 내 최종 버전입니다 로깅의 ...

-(void) printStatus:(NSString*)status, ... 
{ 
    va_list args; 
    va_start(args, status); 
    va_end(args); 
    NSString * str = [[NSString alloc] initWithFormat:status arguments:args]; 
    DLog(@"%@", str); 
    self.statusTextView.text = [_statusTextView.text stringByAppendingFormat:@"\n%@",str]; 
    [str release]; 
} 

DLog

Prefix.pch 파일에 정의되어

#ifdef DEBUG 
# define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) 
#else 
# define DLog(...) /* */ 
#endif 
+0

"// 주 스레드에서이 메서드를 호출하십시오."이 방법은 작동하지 않습니다.varargs 인수를 모두 잃어 버리면 함수는 주 스레드에서 충돌합니다.이 인수 중 하나가 필요하다면 – newacct

+0

감사합니다. 코드를 수정했습니다. 하지만 스레드도 친숙하게해야합니다. – karim