2013-06-21 2 views
0

프레임 워크의 이전 버전에는 A와 B의 두 클래스가 있었고 A는 B의 서브 클래스였습니다. 최신 버전에서는 B가 더 이상 존재하지 않고 B (ivars 등)의 모든 것은 다음과 같습니다. now in A. 실행 파일이 이전 버전과 연결되어 _OBJC_IVAR _ $ _ B.ivar를 찾습니다. 그러나 나는 새 버전에서 작업 할 필요가있다 (나는 그것을 다시 컴파일 할 수 없다). 그래서 _OBJC_IVAR _ $ _ A.ivar에 대한 참조를 변경하는 방법이 있습니까?

답변

1

안전하게이 작업을 수행 할 방법이 없습니다. 심볼을 해석 할 필요가있을뿐만 아니라 런타임이 해당 심볼로 넘어갈 가능성이 있습니다. 기호 별칭이 일 수 있으며 일 수 있지만 깨지기 쉽습니다.

이전 버전의 프레임 워크에서 ivar 기호를 직접 참조하는 실행 파일은 클래스 레이아웃이 호환 가능해야하며 해당 하위 클래스가 해당 ivars와 함께 있어야합니다.

Objective-C "2.0"이 깨지기 쉬운 기본 클래스 문제를 해결했을 때 A와 B가 모두 동일한 이름의 ivar을 가질 수 있기 때문에 클래스에서 클래스로 ivars를 이동하는 기능을 추가하지 않았습니다. 의심 스럽지만).


절대적으로이 경로로 이동해야하는 경우 링크 줄의 기호 별명을 시도 할 수 있습니다. 빌드 설정 편집기에서 OTHER_LD_FLAGS에 적절한 별칭 플래그를 추가

-alias symbol_name alternate_symbol_name 
      Create an alias named alternate_symbol_name for the symbol symbol_name. By default the 
      alias symbol has global visibility. This option was previous the -idef:indir option. 
+0

가 나는 바르 이동 의미하지 않는다, 나는 실행 파일 (B가 더 ​​이상 존재하기 때문에) – user1000039

+1

중요하지 않음을 의미있는 수준의 변화 의미; 그것은 여전히 ​​같은 문제입니다. 링커에서 기호 별명을 지정할 수있는 방법이있을 수 있지만 (이 경우 링커 설명서는 developer.apple.com에서 찾아 볼 수 있습니다.)이 경로는 미완성이며 매우 쉽게 파손될 수 있다는 광기가 있습니다. – bbum

+0

A와 B의 이름이 같은 길이라고 가정하고 16 진수 편집기에서 변경할 수 있습니다. 변경해야 할 문자열의 길이가 어딘가에 있다고 가정합니다. – user1000039