2015-02-12 64 views
2

说我有一个方法:如何检查一个id是一个实例还是一个类?

- (void)method:(id)anObject 
{ 
    // do something 
} 

正如我们都知道的Objective-C类或对象了。所以我一直想知道如何确定id是否在方法内传递了一个类或CLASS本身的INSTANCE?

[object method:[NSObject new]]; 

或:

[object method:[NSObject class]]; 

我怎么能找到传递的参数是一个实例,因为它可以像使用它?我不能仅仅通过发送class消息检查,因为一类将返回相同的结果作为一个实例

EDITED

由亚历山大提供的方法不适合我,因为我不知道是什么课程将通过,所以我无法检查某个班级的成员资格。我只需要知道它是否是一个类(不管是什么类)或是一个实例(不管是什么类)

回答

4

类从class消息返回self消息,实例返回它们的类。所以只是测试,如果从class结果是相同的接收器:

- (void)method:(id)anObject 
{ 
    if (anObject == [anObject class]) { 
     // it's a class 
    } else { 
     // it's an instance 
    } 
} 

编辑:虽然简单,有两个细微的问题,上面的代码:

  1. 接收器必须实现class 。所有NSObject(和NSProxy)派生类都这样做,但对于自定义根类,可能不是这种情况。非常罕见。

  2. 如果一个类不是返回self代码会中断。对于正在观察的对象类(KVO),可能会出现这种情况。并不那么难得。

这里的代码,会一直工作,不受这些问题:

#import <objc/runtime.h> 

- (void)method:(id)anObject 
{ 
    if (class_isMetaClass(object_getClass(obj))) { 
     // it's a class 
    } else { 
     // it's an instance 
    } 
} 
+0

正是我需要的 – 2015-02-12 09:21:44

+0

辉煌的解决方案! – Astoria 2015-02-23 13:51:48

相关问题