source

iPhone에서 Objective-C를 사용한 메서드 이름 NSLogg

goodcode 2022. 8. 8. 20:03
반응형

iPhone에서 Objective-C를 사용한 메서드 이름 NSLogg

현재, 로그의 클래스명과 소스 라인 번호를 인쇄하기 위한 확장 로그 메커니즘을 스스로 정의하고 있습니다.

#define NCLog(s, ...) NSLog(@"<%@:%d> %@", [[NSString stringWithUTF8String:__FILE__] lastPathComponent], \
    __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__])

예를 들어 NCLog(@"Hello world")를 호출했을 때;출력은 다음과 같습니다.

<ApplicationDelegate:10>Hello world

여기서 다음과 같은 메서드 이름도 로그아웃합니다.

<ApplicationDelegate:applicationDidFinishLaunching:10>Hello world

따라서 어떤 메서드가 호출되는지 알 수 있을 때 디버깅이 쉬워집니다.Xcode 디버거도 있지만 로그아웃으로 디버깅을 하고 싶은 경우도 있습니다.

print(__FUNCTION__) // Swift
NSLog(@"%@", NSStringFromSelector(_cmd)); // Objective-C

Swift 3 이상

print(#function)

기술적으로 질문에 답하려면 다음과 같이 하십시오.

NSLog(@"<%@:%@:%d>", NSStringFromClass([self class]), NSStringFromSelector(_cmd), __LINE__);

또는 다음 작업을 수행할 수도 있습니다.

NSLog(@"%s", __PRETTY_FUNCTION__);

dr;dr

NSLog( @"ERROR %@ METHOD %s:%d ", @"DescriptionGoesHere", __func__, __LINE__ );

세부 사항

Apple에는 기술 Q&A 페이지 QA1669 "How can I added context information (현재 메서드나 행번호 컨텍스트 정보)"가 있습니다.

로깅을 지원하려면:

  • C 프리프로세서는 몇 가지 매크로를 제공합니다.
  • Objective-C는 식(메서드)을 제공합니다.
    • 현재 메서드의 선택기에 대한 암묵 인수를 전달합니다._cmd

다른 답변에서 알 수 있듯이 현재 메서드의 이름을 얻으려면 다음 연락처로 문의하십시오.

NSStringFromSelector(_cmd)

현재의 메서드명과 현재의 회선번호를 취득하려면 , 다음의 2개의 매크로를 사용합니다.__func__그리고.__LINE__아래 그림과 같이:

NSLog(@"%s:%d someObject=%@", __func__, __LINE__, someObject);

또 다른 예로는 Xcode의 코드 조각 라이브러리에 보관하고 있는 코드 조각:

NSLog( @"ERROR %@ METHOD %s:%d ", @"DescriptionGoesHere", __func__, __LINE__ );

오류 대신 TRACE...

NSLog( @"TRACE %@ METHOD %s:%d ", @"DescriptionGoesHere", __func__, __LINE__ );

…또한 값을 전달하는 소프트 코드 기술을 사용하여 긴 설명을 사용합니다([rows count])…

NSLog( @"TRACE %@ METHOD %s:%d.", [NSString stringWithFormat:@"'Table of Contents.txt' file's count of Linefeed-delimited rows: %u.", [rows count]] , __func__, __LINE__ );

로깅을 위한 프리프로세서 매크로

매크로의 양쪽에 한 쌍의 밑줄 문자를 사용합니다.

| 매크로 | 포맷 | 설명__func__ %s 현재 함수 시그니처__LINE__ %d 현재 회선 번호__FILE__ %s 소스 파일의 전체 경로__PRITY_FUNTION__%s _func__과(와) 비슷하지만 자세한 내용을 포함합니다.C++ 코드로 정보를 입력합니다. 

로깅 표현식

| Expression | Format | 설명NSString From Selector(_cmd) %@ 현재 셀렉터의 이름NSStringFromClass([self class]) %@ 현재 객체의 클래스 이름[[NSString %@ 소스 코드 파일 이름문자열 포함UTF8String:_파일__]lastPathComponent][NSThread callStackSymbols] %@ 스택트레이스의 NSArray

로깅 프레임워크

일부 로깅 프레임워크는 현재 메서드 또는 회선 번호 취득에도 도움이 될 수 있습니다.자바(SLF4J+LogBack)에서 훌륭한 로깅 프레임워크를 사용했지만 코코아는 사용하지 않았기 때문에 잘 모르겠습니다.

다양한 코코아 로깅 프레임워크에 대한 링크는 이 질문을 참조하십시오.

실렉터 이름

Selector 변수(SEL)가 있는 경우 다음 코덱블로그 투고에 기재되어 있는 방법 중 하나로 그 메서드명("메시지")을 인쇄할 수 있습니다.

  • NSString From Selector에 대한 Objective-C 호출 사용:
    NSLog(@"%@", NSStringFromSelector(selector) );
  • C : "C" :
    NSLog(@"%s", selector );

이 정보는 2013년 7월 19일 현재 링크된 Apple 문서 페이지에서 가져옵니다.그 페이지는 2011년 10월 2004년에 마지막으로 갱신되었습니다.

NSLog(@"%@", NSStringFromSelector(_cmd)); // Objective-C
print(__FUNCTION__) // Swift

이것은 실제로 다음과 같이 단순합니다.

printf(_cmd);

어떤 이유로 iOS에서는 _cmd를 컴파일 경고조차 없이 리터럴 문자로 전달할 수 있습니다.누가 알겠어

Swift 4의 경우:

func test(){

print(#function)

}

test() //값 "test()"를 출력합니다.

언급URL : https://stackoverflow.com/questions/2770307/nslog-the-method-name-with-objective-c-in-iphone

반응형