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
'source' 카테고리의 다른 글
구성 요소에서 이벤트를 수신하는 vuej (0) | 2022.08.08 |
---|---|
롤업 Vue2 - 빌드 실패 (0) | 2022.08.08 |
C/C++, 문자열 리터럴에 #파일을 포함할 수 있습니까? (0) | 2022.08.08 |
Vue.js 데이터 인스턴스 내의 cytoscape 객체를 어떻게 저장합니까? (0) | 2022.08.08 |
char가 표준으로 1이면 size of(char)이라고 쓰는 이유는 무엇입니까? (0) | 2022.08.07 |