2013-09-02 2 views
3

클래스와 프로토콜을 혼합하려고하면 Objective-C에서의 의미는 무엇입니까? 클래스가 프로토콜을 준수하지 않으면 컴파일러에서 경고 메시지를 보내려고합니다. 예를 들어 :이 때Objective-C 클래스 키워드 및 프로토콜

@protocol FLLiveDataProtocol <NSObject> 
... 
@end 

- (id)initWithDataPath:(NSString *)path usingDataClassFactory:(Class<FLLiveDataProtocol>)dataFactoryClass; 

는 그러나, 나는 흥미로운 문제의 모든 종류를 얻을. 첫째, 프로토콜을 준수하지 않는 클래스를 전달하면 컴파일러 오류가 발생하지 않습니다. 두 번째로 [[dataFactoryClass]를 수행하려고하면 Selector alloc에 ​​대한 클래스 메소드를 알 수 없습니다. alloc] init] NSObject를 따르는 프로토콜을 통해서조차.

내가 프로토콜의 및 클래스 키워드를 혼합하려고 사람들의 많은 예를 보지 못했다 (- 감사 니콜라이 나는 형식 정의라고한다).

은 내가 런타임에 확인하는 conformsToProtocol을 사용할 수있어,하지만 난 컴파일시에 확인이 얻을 수 있다면 좋을 것이다.

+0

사실, 런타임에 conformsToProtocol은 확실한 말조차하지 않을 것입니다. 왜냐하면 각 관련 방법에 대해 respondSelector를 수행해야하기 때문입니다. (이것은 "오리 타이핑"의 뒷면입니다. 오리가 아니라는 것을 알 수있는 유일한 방법은 보이지도 걷지도, 돌팔이도 같지 않음을 기억하는 것입니다.) –

+0

잘못된 문제를 해결하려고합니다. 데이터 팩토리가 클래스 여야 만하는 이유는 무엇입니까? 인스턴스면 훨씬 쉽습니다. –

+0

주어진 factory 클래스를 기반으로 여러 인스턴스를 생성해야하므로 표준 Factory 패턴을 사용하고 있습니다. –

답변

7

Objective-C (see this question)의 클래스 객체에 대한 정적 유형 정보가 없으므로 클래스가 프로토콜을 준수 할 필요가 없다는 것을 표현할 방법이 없습니다.

사이드 참고 : Class은 키워드하지만 objc.h의 형식 정의되지 않습니다 : 당신이하려고하면 당신은 "선택 ALLOC 없음을 알고 클래스 메소드"와 같은 오류를 얻을 것이다

typedef struct objc_class *Class; 
+0

Class 구문이 컴파일러에 어떤 의미인지 알고 있습니까? 이 구문을 사용할 때 오류가 발생하지 않습니다. –

+0

클래스 (예 : NSArray * )가 아닌 것으로 알려진 것이 전달되면 경고한다는 점을 제외하면'id '과 같습니다. –

1

초 do [[dataFactoryClass] alloc] init] 을 통해서조차도 프로토콜은 NSObject를 따릅니다.

이 이유는 프로토콜 또는 NSObject protocol+alloc을 선언하지 않기 때문입니다. +alloc 메서드 (또는 새 인스턴스를 반환하는 다른 클래스 메서드)를 프로토콜 선언에 추가하여이 문제를 해결할 수 있습니다.

+0

와우, 이건 정말 흥미 롭습니다. 나는 alloc이 NSObject에 의해 정의되었을 것이라고 생각했다. ObjC 런타임에 대한 자세한 내용을 읽어야합니다. Alloc은 속성을 사용하여 NS_ROOT_CLASS에 자체를 첨부하는 NSProxy 클래스에 의해 구현됩니다. 매우 흥미로운. 무슨 일이 일어나는지 알기 위해 프로토콜에서 alloc 메소드를 정의 해봐야 할 것이다. –

+1

Obj-C 런타임이 왜 여기 관련 있다고 생각하는지 잘 모르겠습니다. '+ alloc'은 * class * NSObject에 의해 구현되고 (NSProxy 클래스에 의해 독립적으로) NSObject 프로토콜에서 선언되지 않습니다. 클래스가 + alloc을 구현하는 것 같지만, 정적 유형'Class '은 이것을 컴파일러에 전달하지 않습니다. –

+0

비록 동의하지만 NSObject 프로토콜이이를 선언하지 않는 것은 이상합니다. –