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