Objective c 区分实例和类

Objective c 区分实例和类,objective-c,Objective C,基本上,我的问题是: -(void)aMethod:(id)object; 理想情况下,我会这样使用我的方法: NSObject*theObject; [MysteryObject aMethod:theObject]; [MysteryObject aMethod:NSObject]; 或者像这样: NSObject*theObject; [MysteryObject aMethod:theObject]; [MysteryObject aMethod:NSObject]; 基本上,

基本上,我的问题是:

-(void)aMethod:(id)object;
理想情况下,我会这样使用我的方法:

NSObject*theObject;
[MysteryObject aMethod:theObject];
[MysteryObject aMethod:NSObject];
或者像这样:

NSObject*theObject;
[MysteryObject aMethod:theObject];
[MysteryObject aMethod:NSObject];
基本上,这就是问题所在。如何区分“id”变量是否仅包含类类型或指向活动对象的指针?

这应该可以:

if ([MysteryObject respondsToSelector:@selector(isSubclassOfClass:)])
    NSLog(@"is a class");
else
    NSLog(@"is an object");

但事实上,为了更方便地使用duck类型,您可能应该使用
respondsToSelector
来检查实际要发送的消息。

虽然使用运行时函数非常好,但我相信这是一种更简单的方法来实现相同的结果:

- (void) aMethod:(id)anObject
{
  if( anObject == [anObject class] ) {
    // the object is a class
  }
  else {
    // the object is an instance object
  }
}

Objective-C和C不是这样关联的……应该去掉
C
标签。这是一个非常清楚的问题-我不知道为什么投票决定结束。第二个代码片段应该是
[MysteryObject-aMethod:[NSObject-class]],否则将是编译错误。我在这里回答了这个问题:这应该可以工作,但需要这样调用:
[MysteryObject-aMethod:[NSObject-class]]
当给它一个类而不是对象时。