【问题标题】:Objective-C Protocol Madness -- how to return object based on protocol?Objective-C Protocol Madness——如何根据协议返回对象?
【发布时间】:2009-09-06 21:40:23
【问题描述】:
@protocol Eating
@end

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

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

在上面的Objective-C代码中,为什么“return self”会导致“Return from incompatible pointer type”警告?什么是不兼容的指针类型以及如何解决?

【问题讨论】:

  • Use @protocol Eating - 它会让你在这些对象上使用 NSObject 方法,而不仅仅是你需要的方法。

标签: iphone objective-c protocols


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

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

【讨论】:

  • 为什么要投反对票?他将其作为第一个发布,因为他自己解决了问题。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • idstruct objc_object* 的类型定义,而不是NSObject *。差别很大。
    【解决方案5】:

    你的使用有点不正常——它是:

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

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

    【讨论】:

    • 指向对象的指针id有什么区别?
    • 实际上没有 - 这就是您的代码不起作用的原因。 (NSObject *) 和 (id) 已经是一回事了(不是真的,但对于本次讨论来说足够接近),所以当你说 (id *) 时,就像说 (NSObject **)。是的,id 和 Class 都是不使用 *... 的对象,这有点奇怪
    猜你喜欢
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多