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 

上記のObjective-Cコードでは、「return self」の結果、「互換性のないポインタ型からの戻り」という警告が表示されるのはなぜですか?互換性のないポインタの種類とその修正方法は何ですか?Objective-C Protocol Madness - プロトコルに基づいてオブジェクトを返す方法?

+1

@protocol Eating を使用すると、必要なメソッドだけでなく、それらのオブジェクトでNSObjectメソッドを使用できます。 – Kornel

答えて

11

idはポインタそのものなので、アスタリスクは必要ありません。

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

アスタリスクではなく、アステリックスです: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とClassは両方とも*を使用しないオブジェクトです... –

1

idは、本質的にNSObject *あるので(若干の差があるが)。したがって、selfを返すと、-(NSObject *)が返されます。あなたが持っているのはid *です。NSObject **のようなものです。

+2

'id'は' struct objc_object * 'のtypedefであり、NSObject *ではありません。違いは重要です。 – dreamlax

関連する問題