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

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

Ответ 1

Чтобы проверить, является ли объект экземпляром класса 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-функция из objective-c runtime api:

#import <objc/runtime.h>

/* ... */

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

EDIT: В Swift

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

Ответ 2

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

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

в любом NSObject

Ответ 3

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

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

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

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

Ответ 4

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

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

Ответ 5

если вы хотите, чтобы имя класса просто вызывало: -

id yourObject= [AnotherClass returningObject];

NSString *className=[yourObject className];

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

Ответ 6

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

(lldb) po [yourObject class]

Как это..

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