Різниця iOS між isKindOfClass та isMemberOfClass


152

Яка різниця між функціями isKindOfClass:(Class)aClassта isMemberOfClass:(Class)aClassфункціями? Я знаю, що це щось на кшталт малого, одне - глобальне, а інше - точне відповідність класу, але мені потрібен хтось, який би вказав, який саме, будь ласка.

У Свіфт isKind(of aClass: AnyClass)і isMember(of aClass: AnyClass).

Відповіді:


264

isKindOfClass:повертається, YESякщо приймач є екземпляром зазначеного класу або екземпляром будь-якого класу, який успадковує вказаний клас.

isMemberOfClass:повертає, YESякщо і лише тоді, коли приймач є екземпляром зазначеного класу.

Більшу частину часу ви хочете використати isKindOfClass:для того, щоб ваш код також працював з підкласами.

Посилання на Протокол NSObject говорить трохи більше про ці методи.


Чи можете ви, будь ласка, очистити мої нижче сумніви? if ([lbl.textColor isMemberOfClass: [клас UIColor]]) {// Not Memeber NSLog (@ "Not Memeber"); } else {NSLog (@ "Not Memeber"); } if ([imgView.image isMemberOfClass: [клас UIImage]]) {// Memeber NSLog (@ "Memeber"); } else {NSLog (@ "Not Memeber"); }
Нікі

82
  • isKindOfClass:вказує, чи успадковується об'єкт від заданого класу
  • isMemberOfClass:вказує, чи об'єкт є примірником даного класу.

[[NSMutableData data] isKindOfClass:[NSData class]]; // YES
[[NSMutableData data] isMemberOfClass:[NSData class]]; // NO

@Durga, якщо це відповідає на ваше запитання, ви повинні прийняти його. Детальніше про прийняття тарифу читайте тут: meta.stackexchange.com/questions/16721/…
понча

1
isKindOfClass також поверне YES, якщо об'єкт є екземпляром даного класу. Іншими словами, isMemberOfClass - це підмножина isKindOfClass.
Скутер

48

Припустимо

@interface A : NSObject 
@end

@interface B : A
@end

...

id b = [[B alloc] init];

тоді

[b isKindOfClass:[A class]] == YES;
[b isMemberOfClass:[A class]] == NO;

В основному, -isMemberOfClass:це істина, якщо екземпляр точно вказаного класу, в той час -isKindOfClass:як істина, якщо екземпляр точно вказаного класу або якщо один з предків екземпляра є вказаним класом.

-isMemberOfClass: рідко використовується.


1
Але якщо у вас є масив підзаписів, які включають UIViews та UISegmentedControl, і ви перебираєте їх і встановлюєте умовний клас, вам потрібно буде використовувати isMemberOfClas UIView та isMemberOfClass UISegmentedControl, щоб розрізняти їх, ні? isKindOfClass побачив би UISegmentedControl як UIView.
PruitIgoe

@Pruitlgoe, що дуже правда. Ви можете використовувати isKindOfClass: [клас UIView], щоб переконатися, що всі об’єкти, з якими ви маєте справу, є UIView, але вам потрібно використовувати isMemberOfClass: [клас UIView] та / або isMemberOfClass: [клас UISegmentedControl] всередині якогось умовного виразу, щоб вказати на будь-яку різну реалізацію поглядів, заснованих на їхньому безпосередньому класі екземпляра
NoodleOfDeath

9

isKindOfClass : Повертає булеве значення, яке вказує, чи є одержувач екземпляром даного класу або екземпляром будь-якого класу, який успадковує цей клас.

isMemberOfClass : Повертає булеве значення, яке вказує, чи є одержувач примірником даного класу.


2

isKindOfClass-> повертає ТАК, коли об'єкт є екземпляром цього класу або екземпляра класу, який успадковується від нього.

isMemberOfClass: повертає YES, коли об'єкт є примірником цього класу, але Ні у випадку: екземпляр класу, який успадковується від нього.

Приклад досить хороший у відповіді jtbandes.


0

Через кластер класів, isMemberOfClass може дати вам відповідь, яку ви можете не очікувати. У багатьох випадках найімовірнішим є ваш вибір - (BOOL) відповідаєToProtocol: (SEL) aSelector або - (BOOL) відповідаєToProtocol: (протокол *) aProtocol. Тобто, краще протестувати їх, якщо вони можуть відповісти на вашу потребу, а не тестувати клас / підклас.

Дивіться apple doc для класу та протоколу NSObject:

http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/occ/cl/NSObject

http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/occ/intf/NSObject

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.