2012-08-15 3 views
2

릴리스 iOS 바이너리를 빌드 할 때 코드 라인에서 발생하는 NSAssert 호출을 비활성화하고 싶습니다. 그런 다음 비활성화되었음을 확인하고 싶습니다. 나는 슈퍼 편집증 환자 야. 장애인임을 어떻게 확인할 수 있습니까?코드 확인 방법 iOS 릴리스 바이너리에서 NSAssert를 호출하지 않습니다.

릴리스 빌드에서 NSAssert 호출을 비활성화하려면 xcodebuild로 수행중인 명령 줄 릴리스 빌드에 NS_BLOCK_ASSERTIONS = 1 (here) 상수를 추가 했으므로 NSAsserts가 다음을 포함하여 전체 응용 프로그램 빌드에서 차단됩니다. 그것이 사용하는 모든 정적 라이브러리의 빌드. 수십 개의 정적 라이브러리가 있으므로 각 라이브러리의 프로젝트 파일에이 플래그가 설정되어 있는지 확인하기에는 너무 많은 유지 관리 작업이 필요하므로이 전역 접근 방식을 사용하는 것이 좋습니다. 그것은이 같은 외모 : 나는 결과 바이너리에서 심볼 테이블을 덤프하고 있습니다 :

다음
xcodebuild -target MyApp -configuration MyReleaseConfig -DNS_BLOCK_ASSERTIONS=1 build 

NSAssert에 대한 우리의 호출이 실제로 차단되어 있는지 확인을 여기에 내가 노력하고, 내가 조언을 구할 곳 것입니다 , 실제 방법에 대한 grepping이이 같은 NSAssert 매크로를 호출합니다 :

# Use 'nm' tool to dump symboltable into txt file 
/Applications/Xcode.app/Contents/Developer/usr/bin/nm MyApp.app/MyApp > MyApp.symbols.txt 

# Search symbols for NSAssertionHandler: 
grep "NSAssertionHandler" ./MyApp.symbols.txt 

# Output results: 
RESULT=$? 
if [ $RESULT -eq 0 ] 
then 
    echo -e "** ASSERTION CHECKER FAILED: FOUND 1 OR MORE NSASSERT CALLS IN RELEASE BINARY **" 
else 
    echo -e "** ASSERTION CHECKER SUCCEEDED: NO NSASSERT CALLS IN RELEASE BINARY **" 
fi 

문제는 내가 아직 NSAssertionHandler이 기호에 표시보고하고 있다는 것입니다 :

U _OBJC_CLASS_$_NSAssertionHandler 

nm을 잘못 사용하고있는 것으로 의심됩니다. 또는이 기호는 NSAsserts를 사용하는 제 3 자 라이브러리 또는 iOS API 자체가 NSAsserts를 사용하기 때문에 제 확인 단계를 혼동시키기 때문에 나타날 수 있습니다. NSAssert에 대한 코드의 모든 호출을 릴리스 빌드에서 차단하고 싶습니다.이 경우 어떻게 확인할 수 있습니까? 모든 제안을 부탁드립니다!

+1

내 릴리스 구성에서 "NS_BLOCK_ASSERTIONS = 1 NDEBUG"을 사용하므로 xcodeBuild를 사용하더라도 해당 파일을 선택합니다. 당신은 NDEBUG를 추가하기를 원합니다. 왜냐하면 "assert()"(입력하기 쉽도록 NSAssert 이상을 사용하는 것)를 비활성화하기 때문입니다. –

+0

2 주 전이 질문을 게시 한 이후로 빌드를 확인하는 방법을 발견하지 못했습니다. 그래서 나는 공식 빌드 프로세스에서 명령 행 설정 ('-DNS_BLOCK_ASSERTIONS = 1'과'-NDEBUG')을 구현하고, 내가 할 수있는 최선이기 때문에 작동한다고 믿는다. . 그러나 누군가 아이디어가 있다면, 나는 여전히 그들을 듣고 싶습니다. 고맙습니다. – Jeffro

+0

정말 쉽습니다. applicationDidLoad에서 #ifdef DEBUG \ nassert * 0); \ n # \ nNSLog (@ "Asserts are ON")를 추가하고 \ nendif. #if NS_BLOCK_ASSERTIONS == 1 \ nNSAssert (0, @ "Gotcha"); \ n ... –

답변

5

당신은 당신이 알고있는 코드 패스에 NSAssert(false, @"test");을 넣을 수 있습니다. 그리고 릴리스 빌드에서 적중했는지를 볼 수 있습니다.

어쨌든 이것은 오래된 질문이기 때문에 나는 똑같은 것을 궁금해했다. 나는 업데이트를 줄 것이라고 생각했다. Xcode 4.6.3에서 제게는 내 릴리스 빌드에 대해 자동으로 정의 된 DNS_BLOCK_ASSERTIONS=1을 볼 수 있습니다. 따라서 NSAssert은 실제로 릴리스 빌드에서 컴파일되지 않습니다.

나는 또한 항상 적중 된 코드 패쓰에서 이것을 테스트했으며 어설 션은 적중되지 않았습니다. 심지어 실제로는 @을 잊어 버렸기 때문에 컴파일되지 않았고 Debug에서도 컴파일되지 않았지만 Release에서 수행되었습니다.

+0

감사합니다. 명령 줄에서 발생할 수있는 기술을 찾고 있었기 때문에 자동 회귀 테스트로 통합 할 수있었습니다. 당신의 기술은 효과가 있지만, 수십개의 정적 라이브러리에서 NSAsserts가 비활성화 된 상태로 빌드되었는지 확인하는 것이 번거로울 수 있습니다. – Jeffro

관련 문제