문제

짧은 버전은 선택적 매개 변수가있는 프로토콜이 있다는 것입니다. iPhone SDK 3.X로 구현하는 클래스를 구축하면 오류 나 경고없이 잘 컴파일합니다. 2.x SDK를 사용하면 다음 경고를받습니다.

Class.m:68: warning: property 'field' requires method '-field' to be defined - use @synthesize, @dynamic or provide a method implementation

두 경우 모두 잘 작동합니다.

그래서 두 가지 질문 :

  1. 경고를 고치는 올바른 방법은 무엇입니까? 나는 추가했다 @dynamic 속성이 실제로 없기 때문에 실제로는 정확하지 않은 구현에 있습니다.
  2. SDK 3.X에서 작동하지만 2.X가 아닌 이유는 무엇입니까? 문서는 "Mac OS X V10.5에서 프로토콜에는 선택적 선언 속성이 포함되지 않을 수 있습니다."라고 말합니다. 분명히 그것은 여기서 정확히 그렇지 않습니다.

여기에 완전히 명확하지 않으면 조금 더 분명하게 만들어야하는 코드의 빠른 샘플이 있습니다.

@protocol MyProtocol
  @required
    - (void) method:(NSString*)param;
  @optional
    @property (nonatomic,retain) NSString* field;
@end

@interface MyClass : NSObject<MyProtocol> {
}
- (void) method:(NSString*)param;
@end
도움이 되었습니까?

해결책

iPhone SDK는 Mac OS X의 모든 정체 버전과 정확히 동일하지 않습니다. 분명히 새로운 버전의 도구 세트는 Snow Leopard의 것과 유사한 SDK 3에 포함되어 있습니다.

다른 팁

경고를 제거하는 Simnple 방법은 추가하는 것입니다.

@dynamic 필드;

구현에. 이를 통해 컴파일러는 구현을 동적으로 제공 할 것이라는 점을 알려줍니다. 선택적 특성이 있기 때문에 원하지 않지만 컴파일러를 닫아야합니다.

@optional은 Objective-C 2.0에 도입되었으므로 이전 버전의 SDK에 적용되지 않습니다. 가장 좋은 방법은 그것이 존재 해야하는지 (아마도 아님)를 결정한 다음

#if __OBJC2__
@optional
@property ...
#endif

그런 다음 OBJC2 아래에서만 컴파일해야하며 프로토콜 자체의 일부로 이전 시스템에 존재하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top