假设我在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
答案 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