В цели c, как я могу определить разницу между классом и экземпляром класса? - PullRequest
3 голосов
/ 10 декабря 2008

Допустим, у меня есть общий указатель в target-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

Как мне написать функцию <code>is_this_a_Class, чтобы она возвращала правильное значение bool?

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

Ответы [ 2 ]

4 голосов
/ 10 декабря 2008

Я не вижу лучшего способа, и это не надежно, но это должно работать:

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% времени.

3 голосов
/ 23 июля 2011

Самый правильный способ - проверить класс объекта и посмотреть, является ли он метаклассом:

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

Здесь есть другие ответы: Проверьте, относится ли объект к типу класса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...