2009-09-06 4 views
9
@protocol Eating 
@end 

@interface Eat : NSObject<Eating> 
{ 
} 
- (id<Eating> *)me; 
@end 

@implementation Eat 
- (id<Eating> *)me { return self; } 
@end 

위의 Objective-C 코드에서 "return self"가 "호환되지 않는 포인터 유형에서 반환"경고를 표시하는 이유는 무엇입니까? 호환되지 않는 포인터 유형이란 무엇이며 어떻게 수정해야합니까?목표 -C 프로토콜 광기 - 프로토콜을 기반으로 객체를 반환하는 방법?

+1

@protocol Eating 을 사용하면 필요한 메서드가 아닌 해당 개체에 NSObject 메서드를 사용할 수 있습니다. – Kornel

답변

11

id은 포인터이므로 별표가 필요하지 않습니다. id 때문에

@interface Eat : NSObject<Eating> { 
} 
- (id<Eating>)me; 
@end 
+1

Asterix가 아닌 별표입니다. http://en.wikipedia.org/wiki/Asterix;) (나를 데려갔습니다. 이 코멘트를 얻으려면 세 번이나!) – dreamlax

0

id *를 제거하고 id로 바꿉니다. id는 이미 포인터입니다.

1

오케이 .. 대답은 "id *"대신 "id"입니다.

+0

당신에게 주어진 답변 중 하나를 수락해야합니다. –

+0

왜 downvote? 그는 문제를 스스로 알아 냈기 때문에 이것을 첫 번째 것으로 올렸습니다. –

0

당신은 당신의 사용에서 약간 떨어져 있습니다 - 그건 :

- (id<Eating>)me { return self; } 

(당신은 객체가 아닌 포인터 ID를 반환하기 때문에).

+0

** 개체 ** 및 ** id **에 대한 포인터의 차이점은 무엇입니까? –

+0

실제로 아무 것도 없습니다 - 이것이 코드가 작동하지 않는 이유입니다. (NSObject *)와 (id)는 이미 똑같은 종류입니다. (이 토론을하기에는 너무 가깝지는 않습니다.) 그래서 (id *)라고 말할 때 (NSObject **)와 같습니다. 네, ID와 클래스가 둘 다 사용하지 않는 객체인데 ... * –

1

(일부 약간의 차이가 있지만) 기본적으로 NSObject *입니다. 따라서 self을 반환하면 -(NSObject *)을 반환하게됩니다. 당신이 가지고있는 것은 id *이고, 이는 NSObject **입니다.

+2

'id'는'struct objc_object *'의 typedef이며 NSObject *는 아닙니다. 그 차이는 중요합니다. – dreamlax

관련 문제