2009-07-20 3 views
13

Cocoa/Objective-C에는 레거시 런타임과 "현대"런타임이라는 두 가지 런타임이 있습니다.iPhone 시뮬레이터 : 합성 인스턴스 변수를 사용할 때 빌드 오류가 발생합니다.

Apple's documentation에 따르면 "iPhone 응용 프로그램과 Mac OS X v10.5 이상의 64 비트 프로그램은 최신 버전의 런타임"을 사용합니다.

지금까지 그렇게 좋았습니다.

"현대"런타임은 "합성 인스턴스 변수"라는 기능을 지원합니다. 즉, 선언 된 모든 속성에 대해 인스턴스 변수를 정의 할 필요가 없습니다. 인스턴스 변수가 자동으로 추가됩니다. iPhone Reference Library에서 인용구 : ".. 현대 런타임의 경우는, 인스턴스 변수는 같은 이름의 인스턴스 변수가 이미 존재하는 경우 필요한, 그것은 사용되는 합성"

당신이 당신의 아이폰 응용 프로그램에서이 기능을 사용하는 경우, 아이폰 (실제) 장치에서 빌드되고 제대로 실행되지만 대상을 "iPhone Simulator"로 변경하면 빌드 오류가 발생합니다.

합성 속성 'x'는 호환되는 ivar 또는 ivar을 명시 적으로 지정해야합니다.

여기에 무슨 일이 일어나고 있습니까? iPhone 시뮬레이터가 진짜 iPhone 시뮬레이터가 아닌가요? 이것은 시뮬레이터가 실제 iPhone과 다른 런타임을 사용한다는 것을 의미합니까?

iPhone 시뮬레이터에서이 기능을 어떻게 사용할 수 있습니까?

편집 :

아이폰 시뮬레이터 대상으로 할 때 컴파일되지 않는 코드는 다음과 같습니다

@interface MyClass : NSObject { 
} 

@property NSString *prop1; 

@end 

문서에 따르면, 이것은 "현대"런타임에 잘 작동합니다 실제로 iPhone 장치에서는 작동하지만 대상을 iPhone Simulator로 변경하면 컴파일되지 않습니다.

답변

15

현재 SDK (3.0)의 iPhone Simulator는 합성 된 ivars를 32 비트 모드로 지원하지 않는 호스트 런타임을 사용합니다. Simulator가 수정 될 때까지 의 ivars가 있어야합니다.

+2

:

코드를 해결하는 가장 간단한 방법은 인스턴스 변수를 추가하는 것입니다. 이것에 대한 SO 주제가 있습니다 (찾을 수 없습니다 - 아마도 코코아 - 개발 스레드 였을 것입니다). http://iphonedevelopment.blogspot.com/2009/06/runtime-madness.html –

+0

@ Daniel : 대답은 –

+1

으로 재 게시 할 가치가 있습니다. 4.0 또는 4.1 SDK에서 수정 된 것 같습니다. –

4

속성을 직접 구현할 계획이 아니라면 합성 된 속성을 '백업하는'변수가 있어야합니다 (이 기능을 요구하는 Apple에 버그를 제출하는 것이 좋습니다). 는 현재 시뮬레이터에서 문제입니다 - 이것은 올바른

@interface MyClass : NSObject { 
NSString * prop1; 
} 

@property NSString *prop1; 

@end 
+1

그 사실을 알고 있지만 그건 내 질문에 대한 답이 아닙니다. iPhone 장치에서 작동하는 기능이 시뮬레이터에서 작동하지 않는 이유는 설명하지 않습니다. 이 속성을 "백업"할 필요가없는 것은 iPhone이 지원하는 "현대"런타임의 기능입니다. –

+0

나는 속성을 정의한 후에 실제로 백업 인스턴스 변수를 정의해야하며 응용 프로그램이 정상적으로 작동한다는 것을 알았습니다. 여기에 무슨 이야기가 있니? 인스턴스 변수가 필요합니까, 아니요? 내 문제가 해결 된 –

+0

! 감사 :) – ExceptionSlayer

관련 문제