2016-12-05 8 views
5

누구나 NSLog와 NSLogv의 차이점을 설명 할 수 있습니까? NSLog은 콘솔에서 데이터를 인쇄하는 데 사용됩니다. 그러나 NSLogv은 무엇입니까?NSLog와 NSLogv의 차이

답변

7

과 비슷한 기능을 NSLog와 비슷하게 작성하려고하지만 메시지를 로깅 외에도 배열에 저장합니다. 어떻게 구현할 것인가?

당신이 variadic functionvoid MySpecialLog(NSString *format, ...)가, 누군가가 단지 NSLog처럼 함수를 호출 할 수 있습니다 작성하는 경우 - MySpecialLog(@"Hello %@!", name); -하지만 format 이상 여분의 인수에 액세스 할 수있는 유일한 방법은 a va_list 함께. C 또는 Obj-C에는 splat operator이 없으므로 함수 내에서 직접 NSLog에 전달할 수 있습니다.

NSLogv는 va_list을 통해 모든 추가 인수를 한 번에 받아 들임으로써이 문제를 해결합니다. 서명은 void NSLogv(NSString *format, va_list args)입니다. 자신의 NSLog 래퍼를 빌드하는 데 사용할 수 있습니다.

의 Obj-C는

void MySpecialLog(NSString *format, ...) 
    NS_FORMAT_FUNCTION(1, 2) 
    // The NS_FORMAT_FUNCTION attribute tells the compiler to treat the 1st argument like 
    // a format string, with values starting from the 2nd argument. This way, you'll 
    // get the proper warnings if format specifiers and arguments don't match. 
{ 
    va_list args; 
    va_start(args, format); 

    // Do something slightly more interesting than just passing format & args through... 
    NSString *newFormat = [@"You've called MySpecialLog()! " stringByAppendingString:format]; 

    NSLogv(newFormat, args); 

    va_end(args); 
} 

당신은 심지어의 Obj-C의 방법으로 NSLog를 포장하기 위해 같은 기술을 사용할 수 있습니다. (-[NSString initWithFormat:]-initWithFormat:arguments:라는 유사한 변형을 가지고 있기 때문에, 당신은 너무 그것을 포장 할 수 있습니다.)

- (void)log:(NSString *)format, ... NS_FORMAT_FUNCTION(1, 2) 
{ 
    // Similarly to the above, we can pass all the arguments to -initWithFormat:arguments:. 
    va_list args; 
    va_start(args, format); 
    NSString *message = [[NSString alloc] initWithFormat:format arguments:args]; 
    va_end(args); 

    // Why not both? 
    va_start(args, format); 
    NSLogv(format, args); 
    va_end(args); 
} 

스위프트

스위프트, 당신은 가변 기능 CVarArg...을 수용하여이 작업을 수행 할 수 있습니다

func mySpecialLog(_ format: String, _ args: CVarArg...) { 
    withVaList(args) { 
     NSLogv("You've called mySpecialLog()! " + format, $0) 
    } 
} 
+0

예하지만 요점을 얻지 못했습니다 ... 왜 우리는 nslogv와 그 목적을 사용해야합니까? – Sivagami

+0

* "" ...첫 번째 코드 예제의 첫 줄에 "NSLog가 없다면 ..."* –

+0

아니요, 요점은 NSLogv가 필요함을 설명하는 것입니다 – jtbandes

1

일반적으로 말하면 접미사 v은 가변 인수 목록 대신에 va_list을 인수로 사용한다는 것을 의미합니다.

void NSLog(NSString *format, ...); 

void NSLogv(NSString *format, va_list args); 

이것은 당신이 가변 인수를 취하는 기능을 "포장"할 필요가 특정 매우 특정한 상황에서 유용

NSLogNSLogv의 경우입니다. 필요한 경우 알 수 있습니다. 그렇지 않으면 안전하게 무시할 수 있습니다.

+0

가변 인수를 취하는 함수를 "감쌀"필요가 있음을 설명하십시오. –

1

NSLogvaradic function입니다. 이는 가변 개수의 인수를 사용함을 의미합니다. 그러나 때때로 프로그래머는 NSLog을 호출하기 전에 다른 작업을 수행하는 자체 varadic 래퍼 함수를 ​​구현하려고합니다.

NSLog이 유일한 함수 인 경우 다른 가변 함수에 일별 가변 인수 (일명 va_list)를 전달할 수 없기 때문에 가능하지 않습니다.

NSLogv은 가변 개수의 인수를 받아들이고이를 NSLogv으로 전달하는 래퍼 인 NSLog과 별도로 존재합니다.