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

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

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

В приведенном выше фрагменте кода Objective-C, почему «возвращение себя» приводит к предупреждению «Возврат из несовместимого указателя»? Что такое несовместимый тип указателя и как его исправить?Objective-C Protocol Madness - как вернуть объект на основе протокола?

+1

Использование @protocol Eating - это позволит вам использовать методы NSObject для этих объектов, а не только методы, которые вам нужны. – Kornel

ответ

11

Потому что id - это указатель, вам не нужна звездочка.

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

Это звездочка, а не Asterix: http://en.wikipedia.org/wiki/Asterix;) (взял меня три раза, чтобы получить этот комментарий!) – dreamlax

0

удалить id * и заменить его идентификатором. id уже является указателем.

1

ОК. Ответ «id» вместо «id *».

+0

Вы должны принять один из ответов, которые были даны вам. –

+0

Почему downvote? Он опубликовал это как первый, потому что сам решил проблему. –

0

Вы немного не в своем использовании - это:

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

(потому что вы возвращаетесь идентификатор, а не указатель на объект).

+0

В чем разница между ** указателем на объект ** и ** id **? –

+0

На самом деле их нет - вот почему ваш код не работал. (NSObject *) и (id) - это уже одно и то же (не совсем, но достаточно близко для этого обсуждения), поэтому, когда вы говорите (id *), это похоже на высказывание (NSObject **). Да, это немного странно, что id и Class являются объектами, в которых вы не используете * ... –

1

Поскольку id по существу NSObject * (хотя есть некоторые незначительные отличия). Таким образом, когда вы возвращаете self, вы возвращаете -(NSObject *). У вас есть id *, который похож на NSObject **.

+2

'id' - это typedef для' struct objc_object * ', а не' NSObject * '. Разница значительна. – dreamlax

Смежные вопросы