iOS разница между isKindOfClass и isMemberOfClass

152

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

В Свифт isKind(of aClass: AnyClass)и isMember(of aClass: AnyClass).

NoodleOfDeath
источник

Ответы:

264

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

isMemberOfClass:возвращает YESif и только в том случае, если получатель является экземпляром указанного класса.

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

В NSObject Protocol Reference немного больше говорится об этих методах.

Себастьян Селис
источник
Можете ли вы очистить мои сомнения ниже? if ([lbl.textColor isMemberOfClass: [UIColor class]]) {// Not Memeber NSLog (@ "Not Memeber"); } else {NSLog (@ "Not Memeber"); } if ([imgView.image isMemberOfClass: [UIImage class]]) {// Memeber NSLog (@ "Memeber"); } else {NSLog (@ "Not Memeber"); }
Никки
82
  • isKindOfClass:указывает, наследует ли объект от данного класса
  • isMemberOfClass:указывает, является ли объект экземпляром данного класса.

[[NSMutableData data] isKindOfClass:[NSData class]]; // YES
[[NSMutableData data] isMemberOfClass:[NSData class]]; // NO
jtbandes
источник
@ Дурга, если это ответит на твой вопрос, ты должен принять это. Узнайте больше о принятии ставки здесь: 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: редко используется.

kennytm
источник
1
Но если у вас есть массив подпредставлений, который включает в себя UIViews и UISegmentedControl, и вы прошли через них и установили условие для класса, вам нужно будет использовать isMemberOfClas UIView и isMemberOfClass UISegmentedControl, чтобы различать их, не так ли? isKindOfClass будет видеть UISegmentedControl как UIView.
PruitIgoe
@Pruitlgoe, это очень верно. Вы можете использовать isKindOfClass: [UIView class], чтобы убедиться, что все объекты, с которыми вы имеете дело, являются UIViews, но вам нужно будет использовать isMemberOfClass: [UIView class] и / или isMemberOfClass: [UISegmentedControl class] внутри некоторого условного оператора, чтобы указать любую отдельную реализацию представлений, основанных на их непосредственном классе экземпляра
NoodleOfDeath
9

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

isMemberOfClass : возвращает логическое значение, которое указывает, является ли получатель экземпляром данного класса.

Алекс Теренте
источник
2

isKindOfClass-> возвращает YES, когда объект является экземпляром этого класса или экземпляром класса, который унаследован от него.

isMemberOfClass: возвращает YES, когда объект является экземпляром этого класса, но No in case: экземпляр класса, который унаследован от него.

Пример достаточно хорош в ответе jtbandes.

Ishu
источник
0

Из-за кластеров классов isMemberOfClass может дать вам ответ, который вы можете не ожидать. Во многих случаях ваш лучший выбор, скорее всего, будет - (BOOL) conformsToProtocol: (SEL) aSelector или - (BOOL) conformsToProtocol: (Protocol *) 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

Арт Сври
источник