릴리스 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에 대한 코드의 모든 호출을 릴리스 빌드에서 차단하고 싶습니다.이 경우 어떻게 확인할 수 있습니까? 모든 제안을 부탁드립니다!
내 릴리스 구성에서 "NS_BLOCK_ASSERTIONS = 1 NDEBUG"을 사용하므로 xcodeBuild를 사용하더라도 해당 파일을 선택합니다. 당신은 NDEBUG를 추가하기를 원합니다. 왜냐하면 "assert()"(입력하기 쉽도록 NSAssert 이상을 사용하는 것)를 비활성화하기 때문입니다. –
2 주 전이 질문을 게시 한 이후로 빌드를 확인하는 방법을 발견하지 못했습니다. 그래서 나는 공식 빌드 프로세스에서 명령 행 설정 ('-DNS_BLOCK_ASSERTIONS = 1'과'-NDEBUG')을 구현하고, 내가 할 수있는 최선이기 때문에 작동한다고 믿는다. . 그러나 누군가 아이디어가 있다면, 나는 여전히 그들을 듣고 싶습니다. 고맙습니다. – Jeffro
정말 쉽습니다. applicationDidLoad에서 #ifdef DEBUG \ nassert * 0); \ n # \ nNSLog (@ "Asserts are ON")를 추가하고 \ nendif. #if NS_BLOCK_ASSERTIONS == 1 \ nNSAssert (0, @ "Gotcha"); \ n ... –