Як я перевіряю, до якого класу належить об’єкт у 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-функція від api об’єкта-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, просто так ми знаємо.
JJ Rohrer

2
Що таке перевага використання class_getNameбільш NSStringFromClass? Якщо цього немає, цю відповідь слід скорегувати.
Dan Rosenstark

21

Ви також можете використовувати

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

на будь-якому об'єкті NSO


8
Це може чи не може працювати на основі того, чи програміст перекрив метод опису. Однак, використовуючи [class class] або NSStringFromClass, завжди повертається ім'я класу.
futureelite7

1
Добре для налагодження та знання того, який тип вашого об’єкта таємниці!
М Джессі

3

Що означає про isKindOfClass в Apple Documentation

Будьте обережні при використанні цього методу на об'єктах, представлених кластерним класом. Через характер кластерних класів об'єкт, який ви повернете, не завжди може бути типом, який ви очікували. Якщо ви викликаєте метод, який повертає кластер класів, точний тип, який повертається методом, є найкращим показником того, що ви можете зробити з цим об’єктом. Наприклад, якщо метод повертає вказівник на об’єкт 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.