从id <protocol>确定对象的类

时间:2015-12-15 18:53:38

标签: objective-c class syntax casting protocols

我有一个类似的课程:

@interface Foo : NSObject <FooDataProvider>
...
@end

在另一个类的某个地方,我有一个带接口的方法:

-(void) doStuff:(id<FooDataProvider>)fooProvider{
...
}

然而我还有其他地方

-(void) passMeClasses:(Class)theClass
{
<do stuff based on the class>
}

通常我会像

那样将事情传递给这个方法
Foo* f = [[Foo alloc] init];
...
[bar passMeClasses:[f class]];

但我不知道如何传递我只有id的东西..就像这样

id<FooDataProvider> f = [[Foo alloc] init];
....
[bar passMeClasses:[f ?????]];

或者如何从doStuff方法

执行此操作
-(void) doStuff:(id<FooDataProvider>)fooProvider{
  Class c = [fooProvider howDoIGetMyClass];
  bar passMeClasses:c];
}

有人可以帮助我从id中确定课程吗?

很抱歉这个冗长的解释,但希望它清楚!

1 个答案:

答案 0 :(得分:1)

[f class]

class是一种方法。它被称为对象。该对象将返回其类(或它应该;它可以在技术上返回其他东西,有时会返回)。变量的类型在运行时完全不相关。在运行时所有对象指针都是id。这就是为什么method signature type encodings只指定“一个物体进入这里”的原因。 (参见@。)它们无法表达对象的特定类型。