Objective-C에서 사용하지 않는 메서드와 #import를 감지하는 방법


99

iPhone 앱에서 오랜 시간 작업을 한 후, 저는 제 코드가 매우 더럽다는 것을 깨달았습니다. 몇 가지 #import 및 호출되지 않거나 전혀 유용하지 않은 메서드가 포함되어 있습니다.

쓸모없는 코드 줄을 감지하는 컴파일러 지시문이나 방법이 있는지 알고 싶습니다. Xcode에이를 감지하는 도구가 있습니까?

답변:


66

Xcode를 사용하면 일부 유형의 사용되지 않는 코드를 경고 할 수있는 특정 컴파일러 경고에 대한 설정을 확인 (취소) 할 수 있습니다. (소스 목록에서 프로젝트를 선택하고 파일> 정보 가져 오기를 선택한 다음 빌드 탭을 선택합니다.) 다음은 관심이있을 수있는 몇 가지 (Clang 및 GCC 4.2에 표시됨)입니다.

  • 사용하지 않는 기능
  • 미사용 매개 변수
  • 미사용 값

사용하지 않는 가져 오기를 감지하는 옵션은 없지만 조금 더 간단합니다. 저 기술 접근 ​​방식은 컴파일 오류 / 경고를받을 때까지 가져 오기 문을 주석 처리하는 것입니다.

사용하지 않는 Objective-C 메서드는 메시지가 동적으로 전달되기 때문에 사용하지 않는 C 함수보다 감지하기가 훨씬 더 어렵습니다. 경고 또는 오류는 잠재적 인 문제가 있음을 알려줄 수 있지만 문제가 없다고해서 런타임 오류가 발생하지 않는다는 보장은 없습니다.


편집 : (잠재적으로) 사용되지 않는 메서드를 감지하는 또 다른 좋은 방법은 실제 실행에서 코드 커버리지를 검사하는 것입니다. 이는 일반적으로 자동화 된 단위 테스트와 함께 수행되지만 반드시 그럴 필요는 없습니다.

이 블로그 게시물 은 Xcode를 사용한 단위 테스트 및 코드 커버리지에 대한 적절한 소개입니다. (그런데 gcovGCC에 의해 생성 된 코드로만 작동하는) 섹션에서는 Xcode가 실행 된 빈도를 기록 할 수있는 계측 된 코드를 빌드하는 방법을 설명합니다. 시뮬레이터에서 회전을 위해 앱의 계측 된 빌드를 가져온 다음 gcov를 실행하면 CoverStory (상당히 단순한 GUI) 또는 lcov(HTML 보고서를 생성하는 Perl 스크립트 ) 와 같은 도구를 사용하여 실행 된 코드를 확인할 수 있습니다. .

내가 사용 gcov하고 lcov대한 CHDataStructures.framework 및 자동 생성 커버리지 리포트 각 SVN 후 커밋. 다시 말하지만, 실행 된 커버리지를 어떤 코드가 "죽었는지"에 대한 결정적인 척도로 취급하는 것은 현명하지 못하지만 추가로 조사 할 수있는 메서드를 식별하는 데 확실히 도움이 될 수 있습니다.

마지막으로, 죽은 코드를 제거하려고했기 때문에이 SO 질문도 흥미 롭다고 생각합니다.


4
요점이 무엇인지 잘 모르겠습니다 ... 정적 분석기는 많은 문제를 찾을 수 있지만으로 입력 된 변수에 메시지를 발송 id하거나 런타임에 호출 할 선택기를 만들면 정적 분석기가 보장 할 수 없습니다. 코드가 실제로 사용되지 않는다는 것입니다. 여전히 필요한 코드가 제거되면 런타임 오류가 발생합니다. 내가 뭔가를 놓치고 있습니까?
Quinn Taylor

1
또한 런타임에 문자열을 기반으로 생성되는 선택기는 매우 일반적입니다.
dreamlax

1
물론, 더 강력한 타입 캐스트 (즉, id 대신 무언가를 반환)함으로써 동적 코드를 더 잘 제공 할 수있는 경우가 있습니다. 런타임 타이핑은 Cocoa / Objective-C 프로그래밍의 강점이지만 때때로 강력한 타이핑에 대해 더 많이 생각하면 유지 관리와 가독성이 더 나을 것입니다.
alesplin

3
오, 확실히 동의합니다. 내 경험 법칙은 드물지만 가끔 발생하는 동적 타이핑이 정말로 필요하지 않는 한 정적으로 타이핑하는 것입니다 (Java에서와 같이). 그러나 Cocoa 클래스와 인터페이스 (예 : 델리게이트 지정)는 추적하기 어려운 역동 성과 실행 경로를 초래할 수 있습니다. 빌어 먹을, 실행 루프 및 다중 스레드를 가지고있는 프로그램이 될 수 사소하지 않은 ...
퀸 테일러



5

최근에 사용하지 않은 (또는 중복 된) #import문 을 찾기 위해 스크립트를 작성했습니다 : https://gist.github.com/Orangenhain/7691314

스크립트는 ObjC .m 파일을 가져 와서 각 #import줄을 차례로 주석 처리 하고 프로젝트가 여전히 컴파일되는지 확인합니다. BUILD_DIR 및 BUILD_CMD를 변경해야합니다.

당신이 사용하는 경우 find여러 파일을 통해 스크립트를 실행하도록하는 명령을 실제로하는 BUILD_CMD을 사용해야합니다 사용하는 모든 파일을 (또는 사용하지 않는 import 문을 많이 가진 파일을 볼 수 있습니다).

나는 AppCode가 비슷한 기능을 가지고 있다는 것을 모르고 이것을 작성했지만, AppCode를 테스트했을 때이 스크립트만큼 철저하지 않았습니다 (그러나 [전체 프로젝트의 경우]).


중복에 대해서만 작동하며 사용하지 않는 가져 오기는 제거되지 않습니다.
Rahul



1

최근에 저는 Carbon에서 Cocoa로 큰 프로젝트를 변경했습니다. 마지막으로 더 이상 사용되지 않는 고아 파일이 꽤 많았습니다. 나는 본질적으로 이것을 한 그들을 찾기 위해 스크립트를 작성했습니다.

소스가 모두 subversion에 체크인되었는지 확인합니다 (예 : 정리) 현재 오류없이 빌드되는지 확인합니다 (예 : xcodebuild가 0 상태를 반환 함). 그런 다음 디렉토리의 각 소스 파일에 대해 비어 있습니다 (예 : 내용을 제거하고 길이를 자릅니다). 소스 및 헤더 파일에 대해 빌드를 시도하고 실패하면 파일을 되돌리고 그렇지 않으면 비워 둡니다.

이것을 실행 한 후 모든 빈 파일을 되 돌린 다음 삭제하고, 오류가있는 모든 #imports를 컴파일 한 다음 제거합니다.

또한 추가해야합니다. .xib 또는 .sdef 파일에서 참조되는 파일을 피해야하며 다른 동적 연결 사례가있을 수 있지만 삭제할 수있는 항목에 대한 좋은 리드를 제공 할 수 있습니다.

동일한 기술을 사용하여 제거 할 수있는 #import를 확인할 수 있습니다. 파일을 자르는 대신 파일에서 각 #import를 차례로 제거하고 빌드가 실패하는지 확인합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.