2010-02-26 3 views
3

프로젝트에 자주 사용하는 사용자 정의 클래스가 있습니다. 이 클래스에는 여러 가지 메소드가 있지만 모든 프로젝트에서 모든 메소드가 사용되는 것은 아닙니다.iPhone 및 iPad - 클래스를 포함하면 바이너리가 증가할까요?

내 질문은 :이 클래스를 프로젝트에 포함 시키면 쓸모없는 코드로 프로젝트가 부풀어 오를 것인가 아니면 컴파일러가 사용 된 메소드 만 포함 할 것인가?

내 수업에 30 가지 방법이 있지만 주어진 프로젝트에 4 가지만 사용되는 경우 컴파일러에 최종 제품에 사용되지 않은 다른 26 개 또는 4 개가 포함될 예정입니까?

모든 것을 포함하는 경우, 사용되지 않는 메소드를 무시하고 바이너리를 최소한으로 트림 할 수있는 방법이 있습니까?

답변

4

링커는 dead-stripping을 지원합니다. 사용하지 않으면 사용하지 않는 코드가 부풀어 올라서는 안됩니다. Apple docs 가입일

:

정적 링커 (LD)은 실행 파일의 미사용 코드 및 데이터 블록의 제거를 지원한다. 이 프로세스는 (데드 코드 스트립 핑이라고도 함)을 사용하면 실행 파일의 전체 크기가 줄어들어 실행 파일의 메모리가 줄어들어 성능이 향상됩니다. 또한 은 사용하지 않는 코드가 정의되지 않은 기호 (결과적으로 링크 오류에서 이 아님)를 나타낼 때 프로그램이 성공적으로 연결될 수 있도록합니다 ( ).

코드 제거는 사용하지 않는 함수 만 제거하고 이진 코드는 실행 코드 만 제거하는 것으로 제한되지 않습니다. 또한 링커는 사용되지 않는 모든 기호 및 데이터 블록에있는 데이터를 제거합니다. 이러한 기호에는 글로벌 변수 변수, 정적 변수 및 문자열 데이터가 포함될 수 있습니다. 실제 심볼의 블록 초기 세트 연결할 코드 위한

데드 - 코드 스트립이 사용

, 정적 링커를 검색한다.

+0

thanks !!!!!!!!!! – SpaceDog

+2

hones이기 때문에 Objective-C에서 이것이 올바른지 확실하지 않습니다. 동적 언어이기 때문에 메서드를 이름으로 호출 할 수 있습니다. 링커는 무엇을 떼어 내고 무엇을 지켜야할지 모릅니다. –

+0

나를 위해 경이로운 작품! http://is.gd/bP8Do (developer.apple.com) –

4

다른 26 개의 메소드가 @implementation에 코드가 있으면 그렇습니다.이 코드는 최종 제품에 사용됩니다.

이유는 런타임 시스템 때문입니다. 컴파일 타임에 26 가지 방법을 사용하지 않더라도 런타임에 참조되지 않을 것이라는 보장은 없습니다 (NSSelectorFromString-performSelector:를 기억하십시오).

강제로이 코드를 제거 할 수 있는지 알 수 없습니다. (-dead_strip이 작동하지 않습니다.)

+1

원래 생각했던 것입니다. jessecurry는 그것을 나에게 확신시켜주지 않았다. –

+0

@ 예 : 아니요, 아니요, 다른 방법입니다. 이러한 ObjC 코드는'__attribute __ ((unused))'을 추가하더라도 무시되지 않습니다 (무시됩니다). – kennytm

1

내 질문은 : 쓸모없는 코드 나와 프로젝트 을 부풀게하는 프로젝트에이 클래스 포함 그냥 방법을 포함 컴파일러를 사용할 것인가?

나는 당신이 당신의 도우미 클래스의 헤더와 구현을 포함하는 것에 대해 이야기하고 있다고 생각합니다. 바이너리 크기가 증가합니다.jessecurry가 지적한 것처럼 링커는 막 다른 스트리핑을 지원합니다. 이것은 바이너리의 공개 API와 연결하려는 가능성이 항상 있기 때문에 나쁘다. (다행스럽게도 아이폰에는 동적 링크가 허용되지 않지만 다른 플랫폼은 고려해야한다.) 그러나 크기 차이가 너무 커서 중요하지 않습니다.

크기면에서 가장 큰 영향은 일반적으로 응용 프로그램에 포함 된 리소스 (이미지, 문자열 등)입니다.

2

큰 뚱뚱한 맘마 클래스를 리팩토링하고 이름을 바꿔야 할 것처럼 들립니다.

+0

정말 의미있는 대답을위한 명성. Objective-C에는 큰 뚱뚱한 맘마 (mamma) 클래스가 필요하지 않습니다. 라이브러리는 슬림화하기가 너무 쉽고 더 큰 fat-mamma 클래스를 사용할 필요가있을 때 .pch 파일에 포함됩니다. – Jann

관련 문제