Objective-C Language
벌채 반출
수색…
통사론
- NSLog (@ "텍스트를 기록"); // 기본 텍스트 로그
- NSLog (@ "데이터 : % f - % .2f", myFloat, anotherFloat); // float 숫자를 포함한 로깅 텍스트.
- NSLog (@ "데이터 : % i", myInteger); // 정수를 포함하는 로깅 텍스트.
- NSLog (@ "데이터 : % @", myStringOrObject); // 다른 String 또는 NSObject에서 파생 된 객체를 참조하는 텍스트 로깅.
비고
다양한 유형의 객체 및 데이터 유형 로깅의 경우 Objective-C, 형식 지정자를 참조하십시오.
벌채 반출
NSLog(@"Log Message!");
NSLog(@"NSString value: %@", stringValue);
NSLog(@"Integer value: %d", intValue);
NSLog
의 첫 번째 인수는 로그 메시지 형식을 포함하는 NSString
입니다. 나머지 매개 변수는 형식 지정자 대신 대체 할 값으로 사용됩니다.
형식은 임의의 Objective-C 오브젝트에 대한 추가 형식 지정자 %@
를 제외하고 printf
와 완전히 동일하게 작동합니다. 이:
NSLog(@"%@", object);
다음과 같습니다.
NSLog(@"%s", [object description].UTF8String);
NSLog 대 printf
NSLog(@"NSLog message");
printf("printf message\n");
산출:
2016-07-16 08:58:04.681 test[46259:1244773] NSLog message
printf message
NSLog
는 로그 메시지 외에도 날짜, 시간, 프로세스 이름, 프로세스 ID 및 스레드 ID를 출력합니다. printf
단지 메시지를 출력합니다.
NSLog
는 NSString
필요하며 끝에 자동으로 새줄을 추가합니다. printf
는 C 문자열을 요구하며 자동으로 개행을 추가하지 않습니다.
NSLog
는 stderr
에 출력을 보내고, printf
는 출력을 stdout
보낸다.
printf
와 NSLog
일부 format-specifiers
자가 다릅니다. 예를 들어 중첩 된 문자열을 포함하는 경우 다음과 같은 차이가 발생합니다.
NSLog(@"My string: %@", (NSString *)myString);
printf("My string: %s", [(NSString *)myString UTF8String]);
NSLog 출력 형식
NSLog(@"NSLog message");
NSLog
를 호출하여 인쇄되는 메시지는 Console.app에서 볼 때 다음 형식을 갖습니다.
날짜 | 시각 | 프로그램 이름 | 프로세스 ID | 스레드 ID | 메시지 | |
---|---|---|---|---|---|---|
2016-07-16 | 08:58:04.681 | test | [46259 | : | 1244773] | NSLog message |
변수 값 기록
다음과 같이 리터럴 형식 문자열없이 NSLog
를 호출하면 안됩니다.
NSLog(variable); // Dangerous code!
변수가없는 경우 NSString
때문에 프로그램은 충돌합니다 NSLog
기대하고 NSString
.
변수가 NSString
이면 문자열에 %
가 포함되어 있지 않으면 작동합니다. NSLog
는 %
시퀀스를 포맷 지정자로 구문 분석 한 다음 스택에서 가비지 값을 읽어 충돌을 일으키거나 임의의 코드를 실행합니다 .
대신, 항상 첫 번째 인수를 다음과 같이 형식 지정자로 지정하십시오.
NSLog(@"%@", anObjectVariable);
NSLog(@"%d", anIntegerVariable);
빈 메시지가 인쇄되지 않습니다.
NSLog
가 빈 문자열을 출력하도록 요청되면 로그를 완전히 생략합니다.
NSString *name = @"";
NSLog(@"%@", name); // Resolves to @""
위의 코드는 아무 것도 인쇄 하지 않습니다 .
로그에 레이블을 붙이는 것이 좋습니다.
NSString *name = @"";
NSLog(@"Name: %@", name); // Resolves to @"Name: "
위의 코드는 다음과 같이 인쇄됩니다.
2016-07-21 14:20:28.623 App[87711:6153103] Name:
릴리스 빌드에서 로그 문 제거
NSLog
에서 인쇄 된 메시지는 응용 프로그램의 릴리스 빌드에서도 Console.app에 표시됩니다. 이는 디버깅에만 유용한 출력물에는 적합하지 않습니다. 이 문제를 해결하려면 NSLog
대신 디버그 로깅을 위해이 매크로를 사용할 수 있습니다.
#ifdef DEBUG
#define DLog(...) NSLog(__VA_ARGS__)
#else
#define DLog(...)
#endif
쓰다:
NSString *value = @"value 1";
DLog(@"value = %@", value);
// little known fact: programmers look for job postings in Console.app
NSLog(@"We're hiring!");
디버그 빌드에서 DLog
는 NSLog
를 호출합니다. 릴리스 빌드에서 DLog
는 아무 작업도 수행하지 않습니다.
__FUNCTION 사용 __
NSLog(@"%s %@",__FUNCTION__, @"etc etc");
클래스 및 메서드 이름을 출력에 삽입합니다.
2016-07-22 12:51:30.099 loggingExample[18132:2971471] -[ViewController viewDidLoad] etc etc
NSLog 및 BOOL 유형
NSLog를 사용하여 부울 유형을 인쇄하는 형식 지정자가 없습니다. 부울 값을 인쇄하는 한 가지 방법은 문자열로 변환하는 것입니다.
BOOL boolValue = YES;
NSLog(@"Bool value %@", boolValue ? @"YES" : @"NO");
산출:
2016-07-30 22:53:18.269 Test[4445:64129] Bool value YES
부울 값을 출력하는 또 다른 방법은이를 정수로 변환하여 이진 출력을 얻는 것입니다 (1 = 예, 0 = 아니오).
BOOL boolValue = YES;
NSLog(@"Bool value %i", boolValue);
산출:
2016-07-30 22:53:18.269 Test[4445:64129] Bool value 1
NSLog 메타 데이터 로깅
NSLog(@"%s %d %s, yourVariable: %@", __FILE__, __LINE__, __PRETTY_FUNCTION__, yourVariable);
로그하려는 변수와 함께 파일, 행 번호 및 기능 데이터를 로깅합니다. 이렇게하면 로그 라인이 훨씬 길어질 수 있습니다 (특히 자세한 파일 및 메소드 이름 사용). 그러나 오류 진단 속도를 높일 수 있습니다.
매크로에서 이것을 랩핑 할 수도 있습니다 (싱글 톤으로 저장하거나 가장 필요로하는 곳).
#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
그런 다음 로그를 남기려면 전화를 걸기 만하면됩니다.
ALog(@"name: %@", firstName);
어떤 것이 당신에게 줄 것입니다;
-[AppDelegate application:didFinishLaunchingWithOptions:] [Line 27] name: John
파일에 추가하여 로깅
NSLog는 좋지만 다음과 같은 코드를 사용하여 파일에 파일을 추가하여 로깅 할 수도 있습니다.
NSFileHandle* fh = [NSFileHandle fileHandleForWritingAtPath:path];
if ( !fh ) {
[[NSFileManager defaultManager] createFileAtPath:path contents:nil attributes:nil];
fh = [NSFileHandle fileHandleForWritingAtPath:path];
}
if ( fh ) {
@try {
[fh seekToEndOfFile];
[fh writeData:[self dataUsingEncoding:enc]];
}
@catch (...) {
}
[fh closeFile];
}