Objective-C协议疯狂 -- 如何基于协议返回对象?

12
@protocol Eating
@end

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

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

在上述 Objective-C 代码中,为什么 "return self" 会导致“返回不兼容指针类型”警告?什么是不兼容的指针类型,如何修复它?


1
使用@protocol Eating<NSObject> - 它将允许您在这些对象上使用NSObject方法,而不仅仅是您所需的方法。 - Kornel
5个回答

15

因为id本身就是一个指针,所以你不需要星号。

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

2
这是一个星号,不是阿斯特里克斯(Asterix):http://en.wikipedia.org/wiki/Asterix ;)(我花了三次才把这个评论弄对!) - dreamlax

2
好的..答案是"id"而不是"id *”。

为什么要踩他的贴?他发帖是因为他自己解决了问题。 - Georg Schölly

1

删除id*并用id替换。 id已经是一个指针。


1
因为id本质上是NSObject *(尽管有一些细微的差别)。因此,当你返回self时,你实际上是返回了-(NSObject *)。你所拥有的是id *,它就像NSObject **

2
idstruct objc_object* 的一种类型定义,而不是 NSObject *。两者之间的区别非常显著。 - dreamlax

0
你在使用上稍微有些偏差 - 正确的写法是:
- (id<Eating>)me { return self; }

(因为你返回的是id,而不是对象的指针)。


指向对象的指针和id之间有什么区别? - Georg Schölly
实际上没有 - 这就是为什么你的代码不起作用的原因。 (NSObject *) 和 (id) 已经有点相同了(不完全相同,但对于这个讨论来说足够接近),所以当你说 (id *) 就像在说 (NSObject **)。是的,id 和 Class 都是对象,你不需要使用 *,这有点奇怪... - Kendall Helmstetter Gelner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接