Как проверить, к какому классу относится объект в Objective-C?


207

Как проверить, является ли объект экземпляром определенного класса в Objective-C? Допустим, я хочу посмотреть, является ли объект a экземпляром класса b или класса c, как мне это сделать?

Ответы:


345

Чтобы проверить, является ли объект экземпляром класса a:

[yourObject isKindOfClass:[a class]]
// Returns a Boolean value that indicates whether the receiver is an instance of 
// given class or an instance of any class that inherits from that class.

или

[yourObject isMemberOfClass:[a class]]
// Returns a Boolean value that indicates whether the receiver is an instance of a 
// given class.

Чтобы получить имя класса объекта, вы можете использовать NSStringFromClassфункцию:

NSString *className = NSStringFromClass([yourObject class]);

или c-function из API-интерфейса target-c:

#import <objc/runtime.h>

/* ... */

const char* className = class_getName([yourObject class]);
NSLog(@"yourObject is a: %s", className);

РЕДАКТИРОВАТЬ: В Swift

if touch.view is UIPickerView {
    // touch.view is of type UIPickerView
}

69
не забудьте #import <objc / runtime.h> для class_getName ()
Овеш


3
Насколько я понимаю, это работает только для объектов, которые наследуют NSObject.
Хенрик П. Хессель

1
@afEkenholm - но не на iOS 4.x, просто так мы знаем.
Джей Джей Рорер

2
В чем преимущество использования class_getNameнад NSStringFromClass? Если его нет, этот ответ следует скорректировать.
Дэн Розенстарк

21

Вы также можете использовать

NSString *className = [[myObject class] description]; 

на любом NSObject


8
Это может или не может работать в зависимости от того, переопределил ли программист метод описания. Однако использование [object class] или NSStringFromClass всегда возвращает имя класса.
futureelite7

1
Хорошо подходит для отладки и знания типа вашего загадочного объекта!
М Джесси

3

Что значит про isKindOfClass в документации Apple

Будьте осторожны при использовании этого метода на объектах, представленных кластером классов. Из-за природы кластеров классов возвращаемый объект может не всегда соответствовать ожидаемому типу. Если вы вызываете метод, который возвращает кластер классов, точный тип, возвращаемый методом, является лучшим индикатором того, что вы можете сделать с этим объектом. Например, если метод возвращает указатель на объект NSArray, вы не должны использовать этот метод, чтобы увидеть, является ли массив изменчивым, как показано в следующем коде:

// DO NOT DO THIS!
if ([myArray isKindOfClass:[NSMutableArray class]])
{
    // Modify the object
}

Если вы используете такие конструкции в своем коде, вы можете подумать, что можно модифицировать объект, который в действительности не должен изменяться. Это может создать проблемы для другого кода, который ожидает, что объект останется неизменным.


Ваш пример кода неверен. Вы столкнетесь с проблемами, только если протестируете NSArray, который в любом случае является неизменным. Если вы хотите протестировать определенный класс, вы должны использовать вместо него isMemberOfClass.
futureelite7

@ futureelite7 Это пример того, как не проверять тип класса. В документации Apple говорится, что -isKindOfClass:& -isMemberOfClass:не следует использовать для идентификации объектов в кластере классов.
pxpgraphics

3

Если вы хотите проверить определенный класс, вы можете использовать

if([MyClass class] == [myClassObj class]) {
//your object is instance of MyClass
}

1

если вы хотите получить имя класса, просто позвоните:

id yourObject= [AnotherClass returningObject];

NSString *className=[yourObject className];

NSLog(@"Class name is : %@",className);

0

Вы также можете проверить время выполнения. Поместите одну точку останова в код и внутри (lldb) записи консоли

(lldb) po [yourObject class]

Как это..

введите описание изображения здесь

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.