애플리케이션을 릴리스하기 전에 NSLog를 비활성화해야 합니까?
앱을 할 때 iPhone을 하면 iPhone 앱 을 릴 사리지않설정한경우록도하용때할스용▁when▁for경우▁i한▁if▁i설정▁an▁appphone▁disablephone록▁i▁releasing않도.NSLog();
성능이 더 좋아질까요?
한 가지 방법은 빌드 설정으로 이동하여 디버그 구성에서 다음과 같은 "Preprocessor Macros" 값에 값을 추가하는 것입니다.
DEBUG_MODE=1
베타 또는 릴리스 버전이 아닌 디버그 구성에 대해서만 이 작업을 수행해야 합니다.그런 다음 공통 헤더 파일에서 다음과 같은 작업을 수행할 수 있습니다.
#ifdef DEBUG_MODE
#define DLog( s, ... ) NSLog( @"<%p %@:(%d)> %@", self, [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] )
#else
#define DLog( s, ... )
#endif
이제대 에.NSLog
사용하다DLog
및 시 메시지가 테스트하고 디버깅할 때 디버그 메시지가 표시됩니다.베타나 최종 릴리스를 출시할 준비가 되면, 이러한 모든 것이DLog
라인은 자동으로 비워지고 아무것도 방출되지 않습니다.을 달지 않아도 NSLogs
됩니다.빌드 대상을 선택하면 처리됩니다.
Xcode 5 및 iOS 7용 업데이트
참고: 릴리스 빌드에서 print() 문을 제거하는 Xcode 7/Swift 2.1 솔루션의 경우 여기에서 내 대답을 찾으십시오.
예, 릴리스 코드에서 NSLog 문을 제거해야 합니다. NSLog 문은 코드 속도를 저하시킬 뿐 릴리스 버전에서는 사용할 수 없습니다.다행히 Xcode 5(iOS 7)에서는 릴리스 빌드에서 모든 NSLog 문을 '자동'으로 제거하는 것이 놀라울 정도로 간단합니다.그러니 그렇게 하지 그래요.
먼저 취해야 할 세 가지 단계, 그리고 약간의 설명.
Xcode 프로젝트에서 'yourProjectName-prefix.pch' 파일을 찾습니다(일반적으로 main.m 파일이 있는 'supporting files' 그룹 아래에서 이 파일을 찾을 수 있습니다).
'.pch' 파일의 끝에 다음 세 줄을 추가합니다.
#ifndef DEBUG
#define NSLog(...);
#endif
사용 중인 '버전'과 '버전' 간의 차이를 테스트합니다.이를 위한 한 가지 방법은 'edit scheme' -> 'run app name' -> 'info' 탭 아래에서 debug와 release 사이의 드롭다운 상자를 사용하여 선택하는 것입니다.릴리스 버전에서는 디버그 콘솔에서 NSLog 출력을 볼 수 없습니다!
이 모든 것이 어떻게 작동합니까?
우선, 프리프로세서가 상대적으로 '확장'되고 컴파일러가 호출되기 전에 '텍스트 대체자' 역할을 한다는 것을 알아야 합니다.define' 뒤에 define'을합니다.#define
진술.
#define NSLog(...);
그(...)
괄호() 사이의 'anything'는 '''를 나타냅니다.또한 주의하십시오.;
이 꼭 한 것은 , 이 더 ' 때문에 저는 거기에 .컴파일러가 이것을 최적화하기 때문에 이것이 엄격히 필요한 것은 아니지만, 저는 그것이 더 '정확'하기 때문에 그것을 거기에 두고 싶습니다.저희가 끝나고 나서.#define
'는 '하고, '도'로 줄을 그냥 입니다.NSLog...
까지 그리고 포함하여;
.
는 을사용조진건만술들수정있다의니합음을을다음부를 사용하여 수 .#ifdef
) (으)로 표시됩니다.#ifndef
되지 않은 )(정의되지 않은 경우)
우리는 여기에 씁니다.#ifndef DEBUG
이는 'DEBUG 기호가 정의되지 않은 경우'를 의미합니다. 그#ifdef
또는#ifndef
' 을 ' 요 ' 가 ' 음 '와 함께 합니다.#endif
Xcode 5는 빌드 모드가 'DEBUG'일 때 기본적으로 'DEBUG' 기호를 정의합니다.'release'에서는 이를 정의하지 않습니다.프로젝트 설정에서 '빌드 설정' 탭 -> 아래로 스크롤하여 'Apple LLVM 5.0 - 전처리' -> 전처리 매크로 섹션으로 이동할 수 있습니다.'DEBUG' 기호가 릴리스 빌드에 대해 정의되지 않음을 알 수 있습니다!
마지막으로 .pch 파일은 Xcode에 의해 자동으로 생성되며 컴파일 시간 동안 모든 소스 파일에 자동으로 포함됩니다.그래서 당신이 모든 것을 넣었을 것입니다.#define
각 소스 파일에 저장할 수 있습니다.
위의 거의 모든 답변은 해결책을 제시하지만 문제를 설명하지는 않습니다.구글에서 검색해보니 이유를 찾았습니다.제 대답은 이렇습니다.
네, 릴리스 버전에서 NSLog를 코멘트아웃하면 성능이 향상됩니다. NSLog는 매우 느리기 때문입니다. 왜죠? NSLog는 두 가지 일을 할 것입니다. 1) 로그 메시지를 Apple System Logg(ASL)에 작성하고, 2) 앱이 xcode로 실행되면 stderr에도 작성합니다.
주요 문제는 첫 번째 문제에 있습니다.스레드 세이프를 달성하기 위해 NSLog가 호출될 때마다 ASL 설비에 대한 연결을 열고, 메시지를 보내고, 연결을 닫습니다.연결 작업은 매우 비쌉니다.또 다른 이유는 NSLog가 기록할 타임스탬프를 가져오는 데 약간의 시간을 소비하기 때문입니다.
여기서 나온 참조.
제가 개인적으로 좋아하는 것은 가변 매크로를 사용하는 것입니다.
#ifdef NDEBUG
#define NSLog(...) /* suppress NSLog when in release mode */
#endif
전화하지 않는 것에 대해 현명하게 언급한 모든 사람들 외에도.NSLog()
운영 속도가 약간 더 빠릅니다. 다음과 같이 덧붙입니다.
상점에서 앱을 다운로드하고 Xcode를 실행하는 Mac에 연결된 상태에서 실행하는 모든 출력 문자열은 주최자 창을 통해 누구나 볼 수 있습니다.
기록하는 정보(특히 앱이 서버에 연결하거나 인증을 수행하는 경우)에 따라 심각한 보안 문제가 될 수 있습니다.
Xcode에서 프로젝트의 현재 기본 설정 내부,NS_BLOCK_ASSERTIONS
매크로는 릴리스 버전에서 1로 설정됩니다.DEBUG=1
디버그 버전입니다.
그래서 저는 다음과 같은 방법을 선호합니다.
// NS_BLOCK_ASSERTIONS is defined by default, as shown in the screenshot above.
// Or, you can define yourself Flags in the `Other C Flags` -> `Release`.
#ifndef NS_BLOCK_ASSERTIONS
#define _DEBUG
#endif
#ifdef _DEBUG
// for debug mode
#define DLog(fmt,...) NSLog(@"%s " fmt, __FUNCTION, ##__VA_ARGS__)
... /// something extra
#else
// for release mode
#define DLog(fmt,...) /* throw it away */
... /// something extra
#endif
예, 사용하지 않도록 설정해야 합니다.특히 코드 속도를 최대화하려는 경우에는 더욱 그렇습니다.NSLogging 왼쪽 및 오른쪽 항목은 다른 개발자가 파내려 할 수 있는 시스템 로그를 오염시키고 속도에 중요한 코드(루프 내부 등)에 큰 영향을 미칠 수 있습니다.실수로 로그 메시지를 한 번 반복 함수에 남겼다가 몇 주 후에 "30% 속도 증가!"라는 업데이트를 릴리스하게 되었습니다.;-)
모든 좋은 답변이지만, 주로 앱의 개발/테스트 단계에서 사용을 고려할 수 있는 또 다른 작은 트릭이 있습니다.
또한 디버깅 코드만 설정하고 코드의 직접적인 제어 범위 밖의 문제를 나타내는 메시지는 설정하지 않으려는 경우에도 앱 릴리스 코드에 유용할 수 있습니다.
요령:
.m 파일의 맨 위에 다음 행을 포함하여 .m 파일당 NSLog를 끌 수 있습니다.
#define NSLog(...)
(참고: .h 파일은 넣지 말고 .m 파일만 넣어주세요!)
이것은 단지 컴파일러가 평가하게 합니다.NSLog()
대신 프리프로세서 매크로를 확장합니다.매크로는 인수만 제거합니다.
다시 켜려면 언제든지 사용할 수 있습니다.
#undef NSLog
예를 들어 다음과 같은 작업을 수행하여 특정 메소드 그룹을 중심으로 NSLog에 대한 아웃바운드 호출을 방지할 수 있습니다.
#define NSLog(...)
-(void) myProblematicMethodThatSometimesNeedsDebugging {
...
}
#undef NSLog
NSLog는 속도가 느리기 때문에 릴리스 빌드에 사용하면 안 됩니다.아래와 같은 간단한 매크로를 사용하면 사용자가 사용하지 않도록 설정해야 할 어설션과 함께 사용하지 않도록 설정할 수 있습니다.NSLog를 릴리스 빌드에 사용하려는 일반적이지 않은 경우에는 직접 호출하십시오."다른 C 플래그" 빌드 설정에 "-DNDEBUG"를 추가하는 것을 잊지 마십시오.
#ifdef NDEBUG
#define MYLog(f, ...)
#else
#define MYLog(f, ...) NSLog(f, ## __VA_ARGS__)
#endif
pch 파일에서 #endif 앞에 이것을 적습니다.
#define NSLog() //
이것은 어떻습니까?
#ifndef DEBUG_MODE
fclose(stderr); // the simplest way to disable output from NSLog
#endif
var showDebugLogs = false;
func DLog(format: String, args: CVarArgType...) {
if showDebugLogs{
println(String(format: format, arguments: args))
}
}
이렇게 하면 추가 인수도 허용됩니다.필요에 따라 showDebugLogs 매개 변수 값을 true 또는 false로 변경합니다.
언급URL : https://stackoverflow.com/questions/2025471/do-i-need-to-disable-nslog-before-release-application
'programing' 카테고리의 다른 글
Vuex에서 개체를 올바르게 혼합하고 격리하는 방법 (0) | 2023.06.16 |
---|---|
IPthon 노트북의 로깅 모듈에서 출력 가져오기 (0) | 2023.06.16 |
C/C++의 열에 주조 (0) | 2023.06.16 |
생성자가 서명 new와 일치하지 않습니다. (0) | 2023.06.16 |
Firebase와 함께 NodeJs 사용 - 보안 (0) | 2023.06.16 |