3

假设我在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函数以使其返回正确的bool值?

bool is_this_a_Class(id somePointer)
{
    // your code goes here
}
4

2 回答 2

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% 的情况下。

于 2008-12-10T07:40:07.950 回答
3

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

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

这里有更多答案:检查对象是否为类类型

于 2011-07-22T22:53:01.557 回答