IT

응용 프로그램을 릴리스하기 전에 NSLog를해야하고 전에?

lottoking 2020. 7. 21. 07:42
반응형

응용 프로그램을 릴리스하기 전에 NSLog를해야하고 전에?


iPhone 용 앱을 출시 할 때 NSLog();하면 더 잘 작동합니까?


빌드를 수행하는 한 가지 방법은 빌드 설정으로 이동하여 디버그입니다 구성에서 "전 처리기 매크로"값에 다음과 같은 값을 추가하는 것입니다.

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 업데이트

참고 : 릴리스 빌드에서 인쇄 ()을 제거 하는 엑스 코드 7 / 2.1 스위프트 솔루션의 경우 여기에서 내 대답을 찾으 십시오 .

예. 릴리스 코드에서 NSLog 문을 제거하면 코드 속도가 떨어지고 릴리스 버전에서는 사용하지 않습니다 NSLog 문을 제거합니다. 많은 Xcode 5 (iOS 7)에서는 릴리스 빌드에서 모든 NSLog 문을 '자동으로'제거하는 것이 매우 간단합니다. 왜 안나요?

먼저 3 단계를 수행 한 다음 몇 가지 설명

1) Xcode 프로젝트에서 'yourProjectName-prefix.pch'파일을 찾으십시오 (일반적으로 main.m 파일이있는 '지원 파일'그룹 아래에 있습니다.

2) '.pch'파일의 끝에이 세 줄을 추가하십시오.

#ifndef DEBUG
   #define NSLog(...);
#endif

3) '디버그'와 '릴리스'버전의 차이점을 테스트하십시오. 이를 수행하는 한 가지 방법은 '정보 체계 편집'-> '앱 이름 실행'-> '정보'탭 아래에서 디버그 및 릴리스 사이의 드롭 다운 상자를 사용하여 선택하는 것입니다. 릴리스 버전에서는 디버그 콘솔에 NSLog 출력이 표시되지 않습니다!

이 모든 것이 어떻게 작동합니까?

우선, 전처리 기가 최강으로 '멍청한 것'임을 알고 있으며 컴파일러가 호출되기 전에 '텍스트 대체 기'역할을합니다. 그것은 당신이 '#define'을 #define문장에서 대체 합니다.

#define NSLog(...);

(...)괄호 사이에 '무엇이든'()을 의미합니다. ;끝에 도 마음 . 그래서 필요한 것은 더 많은 것입니다. 우리 #define가 '아무것도'없는 , 전처리 기는 그것을 '아무것도'대체하지 않기로 때문에 NSLog...까지 시작하여 를 포함하여 전체 줄을 버릴을 구석으로 ;입니다.

정의 문은 #ifdef(정의 된 경우) 또는 #ifndef(정의되지 않은 경우 )를 사용하여 조건부로 작성 될 수 있습니다.

여기서 우리 #ifndef DEBUG는 '기호 DEBUG가 정의되지 않은 경우'를 의미합니다. #ifdef또는 될 #ifndef필요가와 '폐쇄'#endif

Xcode 5는 빌드 모드가 'DEBUG'일 때 기본적으로 'DEBUG'기호를 정의합니다. '릴리스'에서는 정의되지 않습니다. 프로젝트 설정에서 '빌드 설정'탭-> 'Apple LLVM 5.0- 전처리'-> 전 처리기 매크로 섹션으로 스크롤하십시오. 릴리스 빌드에는 'DEBUG'기호가 정의되어 있지 않습니다.

마지막으로 .pch 파일은 Xcode에 의해 자동으로 만들어지고 시간 동안 모든 소스 파일에 자동으로 포함됩니다. 모든 마치 #define소스 파일에 모든 것을 넣은 것처럼 보입니다.


위의 거의 모든 해결 방법을 제시하지만 문제를 설명합니다. Google에서 검색을 수행 한 이유를 찾았습니다. 내 대답은 다음과 달라집니다.

예, 릴리스 버전에서 NSLog를 주석 처리하면 성능이 향상됩니다. NSLog는 매우 느리기 때문입니다. 왜? NSLog는 1) Apple System Logging (ASL)에 로그 메시지 작성, 2) 앱이 xcode에서 실행되면 stderr에도 작성됩니다.

주요 문제는 첫 번째 문제에 있습니다. 회의를 달성하기 위해 NSLog가 호출 될 때마다 ASL 기능에 대한 연결을 메시지를 보낸 후 연결을 닫습니다. 연결 작업이 매우 비쌉니다. 또 다른 이유는 NSLog가 타임 스탬프를 기록하는 데 시간이 걸리기 때문입니다.

여기 에서 참조 하십시오 .


개인적으로 가장 좋아하는 것은 가변 매크로를 사용하는 것입니다.

#ifdef NDEBUG
    #define NSLog(...) /* suppress NSLog when in release mode */
#endif

NSLog()현업에서 전혀 전혀하지 않는 것이 약간 더 빠르다고 현명하게 많은 사람들 외에도 다음과 같이 전화 입니다.

모든 NSLog()클라이언트는 스토어에서 앱을 다운로드하고 Xcode를 실행하는 Mac에 장치를 연결 한 상태 에서 Organizer 창을 통해 실행 하는 모든 사람에게 표시 됩니다.

어떤 정보를 기록하는지에 따라 (순위 앱이 서버에 접속하거나 인증하는 등의 경우) 심각한 보안 문제가 될 수 있습니다 .


프로젝트 기본 설정

Xcode에서 프로젝트의 현재 기본 설정 내에서 NS_BLOCK_ASSERTIONS매크로는 릴리스 버전 및 DEBUG=1디버그 버전에서 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(...)

( 참고 : 않는 NOT 만하는 .m 파일을 이것을 .H 파일을 넣어! )

이렇게하면 컴파일러가 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

반응형