Я не вижу лучшего способа, и это не надежно, но это должно работать:
BOOL pointer_isClass(id object) {
return [object respondsToSelector:@selector(instancesRespondToSelector:)];
}
Поскольку теоретически только Class
объекты будут отвечать на сообщение -instancesRespondToSelector:
, это должно сработать. Вне фактического objc_*
вызова, хотя я не вижу никакого реального API для этого.
UPDATE:
После прочтения ответа Джао мне пришла другая мысль, проверим реакцию указателя на метод -class
. Вызов -class
для объекта класса должен быть эквивалентен вызову -self
для экземпляра объекта, но возвращать другой объект для экземпляра объекта.
BOOL pointer_isClass(id object) {
return object == [object class];
}
Я думаю, что это должно быть более надежным, особенно в случае, когда экземпляр объекта реализует -instancesRespondToSelector:
, этот должен работать 100% времени.