누구나 NSLog와 NSLogv의 차이점을 설명 할 수 있습니까? NSLog
은 콘솔에서 데이터를 인쇄하는 데 사용됩니다. 그러나 NSLogv
은 무엇입니까?NSLog와 NSLogv의 차이
답변
과 비슷한 기능을 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)
}
}
NSLog
은 varadic function입니다. 이는 가변 개수의 인수를 사용함을 의미합니다. 그러나 때때로 프로그래머는 NSLog
을 호출하기 전에 다른 작업을 수행하는 자체 varadic 래퍼 함수를 구현하려고합니다.
NSLog
이 유일한 함수 인 경우 다른 가변 함수에 일별 가변 인수 (일명 va_list
)를 전달할 수 없기 때문에 가능하지 않습니다.
NSLogv
은 가변 개수의 인수를 받아들이고이를 NSLogv
으로 전달하는 래퍼 인 NSLog
과 별도로 존재합니다.
예하지만 요점을 얻지 못했습니다 ... 왜 우리는 nslogv와 그 목적을 사용해야합니까? – Sivagami
* "" ...첫 번째 코드 예제의 첫 줄에 "NSLog가 없다면 ..."* –
아니요, 요점은 NSLogv가 필요함을 설명하는 것입니다 – jtbandes