iOS разница между isKindOfClass и isMemberOfClass - PullRequest
146 голосов
/ 06 сентября 2010

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

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

Ответы [ 6 ]

257 голосов
/ 06 сентября 2010

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

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

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

Справочник по протоколу NSObject немного больше говорит об этих методах.

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

[[NSMutableData data] isKindOfClass:[NSData class]]; // YES
[[NSMutableData data] isMemberOfClass:[NSData class]]; // NO
48 голосов
/ 06 сентября 2010

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

@interface A : NSObject 
@end

@interface B : A
@end

...

id b = [[B alloc] init];

тогда

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

По сути, -isMemberOfClass: имеет значение true, если экземпляр точно соответствует указанному классу, а -isKindOfClass: - true, если экземпляр точно соответствует указанному классу или если один из предков экземпляра имеет указанный класс. *

-isMemberOfClass: используется редко.

9 голосов
/ 27 июля 2011

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

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

2 голосов
/ 27 июля 2011

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

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

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

0 голосов
/ 11 января 2012

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

См. Документ Apple для класса и протокола 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

...