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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

Предположим, что

@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: используется редко.

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

Из-за кластеров классов isMemberOfClass может дать вам ответ, которого вы не ожидаете. Во многих случаях ваш лучший выбор, скорее всего, будет (BOOL) соответствуетToProtocol: (SEL) aSelector или - (BOOL) соответствуетToProtocol: (Protocol *) aProtocol. I.e, лучше проверить их, если они могут ответить на ваши потребности, а не тестировать класс/подкласс.

См. 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