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

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

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

W powyższym fragmencie kodu Objective-C, dlaczego "return self" powoduje ostrzeżenie "Return from incompatible indicator type"? Jaki jest niekompatybilny typ wskaźnika i jak go naprawić?Szaleństwo protokołu Objective-C - jak zwrócić obiekt na podstawie protokołu?

+1

Użyj @ protoco Eating - pozwoli ci używać metod NSObject na tych obiektach, a nie tylko potrzebnych metod. – Kornel

Odpowiedz

11

Ponieważ wskaźnik id jest sam, nie potrzebujesz gwiazdki.

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

To jest gwiazdka, a nie Asterix: http://en.wikipedia.org/wiki/Asterix;) (zabrał mnie trzy razy, aby ten komentarz był poprawny!) – dreamlax

0

usunąć id * i zastąpić id. id jest już wskaźnikiem.

1

OK .. odpowiedź to "id" zamiast "id *".

+0

Powinieneś zaakceptować jedną z udzielonych ci odpowiedzi. –

+0

Dlaczego downvote? Powiedział to jako pierwszy, ponieważ sam wyłożył problem. –

0

Jesteś lekko off w użyciu - to:

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

(bo wracają id, a nie wskaźnik do obiektu).

+0

Jaka jest różnica między ** wskaźnikiem a obiektem ** i ** id **? –

+0

W rzeczywistości nie ma żadnego - dlatego Twój kod nie działa. (NSObject *) i (id) są już trochę takie same (nie tak naprawdę, ale wystarczająco blisko do tej dyskusji), więc kiedy mówisz (id *), to jest jak mówienie (NSObject **). Tak, to trochę dziwne, że id i Class są obiektami, w których nie używasz * ... –

1

Ponieważ id zasadniczo NSObject * (chociaż istnieją pewne niewielkie różnice). Tak więc po powrocie na numer self wracasz -(NSObject *). To, co masz, to id *, które jest podobne do NSObject **.

+2

'id' jest typedef dla' struct objc_object * ', a nie' NSObject * '. Różnica jest znacząca. – dreamlax

Powiązane problemy