2009-09-06 122 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協議瘋狂 - 如何基於協議返回對象?

+1

使用@protocol飲食 - 它會讓你在這些對象上使用NSObject方法,而不僅僅是你需要的方法。 – Kornel 2009-09-07 00:31:23

回答

11

因爲id本身就是一個指針,所以不需要星號。

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

這是一個星號,而不是一個Asterix:http://en.wikipedia.org/wiki/Asterix;)(帶我三次才能得到這個評論!) – dreamlax 2009-09-07 14:14:04

0

刪除id *並替換爲id。 ID已經是一個指針。

1

好的..答案是「id」而不是「id *」。

+0

你應該接受給你的答案之一。 – 2009-09-06 21:47:06

+0

爲什麼downvote?他把這個作爲第一個發佈,因爲他發現自己的問題。 – 2009-09-07 08:24:22

0

你稍微偏離你的使用 - 它是:

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

(因爲你是返回ID,而不是一個指向對象)。

+0

**指向對象**和** id **的指針有什麼區別? – 2010-01-26 11:35:59

+0

其實沒有 - 這就是爲什麼你的代碼不工作。 (NSObject *)和(id)是一樣的東西(不是真的,但足夠接近這個討論),所以當你說(id *)就像說(NSObject **)。是的,它有點奇怪,id和Class是兩個對象,你不使用* ... – 2010-01-26 17:10:31

1

由於id基本上NSObject *(雖然也有一些小的差異)。因此,當您返回self時,您將返回-(NSObject *)。你有什麼是id *這就像NSObject **

+2

'id'是'struct objc_object *'的typedef,而不是'NSObject *'。差異是顯着的。 – dreamlax 2009-09-07 14:06:33