在objective-c中,我如何区分Class和类的实例?

时间:2008-12-10 07:10:52

标签: objective-c pointers

假设我在objective-c中有一个通用指针。该指针可以是Class对象,也可以是该类的实例。有没有办法说出两者之间的区别?

示例:


id pointerA = [someClass class];
id pointerB = [[someClass alloc] init];

bool pointerAIsAClass = is_this_a_Class(pointerA); // should be true
bool pointerBIsAClass = is_this_a_Class(pointerB); // should be false

如何编写is_this_a_Class函数以便返回正确的is_this_a_Class值?

bool

2 个答案:

答案 0 :(得分:4)

我没有看到更好的方法,这不是万无一失的,但这应该有效:

BOOL pointer_isClass(id object) {
    return [object respondsToSelector:@selector(instancesRespondToSelector:)];
}

从理论上讲,只有Class个对象会响应-instancesRespondToSelector:消息,这应该有效。在实际的objc_*电话之外,虽然我没有看到任何真正的API。

<强>更新
在读完Giao的回答后,另一个想法来到我身边,测试指针对-class方法的反应。在类对象上调用-class应该等同于在对象实例上调用-self,但是会在对象实例上返回另一个对象。

BOOL pointer_isClass(id object) {
    return object == [object class];
}

我认为这应该更加万无一失,特别是在对象实例实现-instancesRespondToSelector:的情况下,这个应该在100%的时间内工作。

答案 1 :(得分:3)

最正确的方法是检查对象的类,看看它是否是元类:

BOOL object_isClass(id object) {
    return class_isMetaClass(object_getClass(object));
}

这里有更多答案:Check if object is Class type