수색…


통사론

  • 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 단지 메시지를 출력합니다.

NSLogNSString 필요하며 끝에 자동으로 새줄을 추가합니다. printf 는 C 문자열을 요구하며 자동으로 개행을 추가하지 않습니다.

NSLogstderr 에 출력을 보내고, printf 는 출력을 stdout 보낸다.


printfNSLog 일부 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!"); 

디버그 빌드에서 DLogNSLog 를 호출합니다. 릴리스 빌드에서 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];
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow