В Objective-C, как я могу сказать разницу между классом и экземпляр класса?

голоса
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
}
Задан 10/12/2008 в 08:10
источник пользователем
На других языках...                            


2 ответов

голоса
4

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

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

Так, теоретически, только Classобъекты будут реагировать на -instancesRespondToSelector:сообщения это должно работать. Вне фактического objc_*вызова , хотя я не вижу каких - либо реальных API для этого.

UPDATE:
После прочтения ответа Giao в другую мысль пришла ко мне, проверить реакцию указателя на -classметод. Вызов -classна объект класса должен быть эквивалентен вызову -selfна экземпляр объекта , но будет возвращать другой объект на экземпляр объекта.

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

Я думаю , что это должно быть более надежными, особенно в том случае , когда экземпляр объекта реализующего -instancesRespondToSelector:этот должен работать 100% времени.

Ответил 10/12/2008 в 08:40
источник пользователем

голоса
3

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

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

Есть больше ответов здесь: Проверьте , если объект типа Class

Ответил 22/07/2011 в 23:53
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more