2010-09-06 3 views
133

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

ответ

238

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

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

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

NSObject Protocol Reference рассказывает об этих методах.

+0

Можете ли вы прочистить под сомнение? 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"); } – Nikkie

44

Пусть

@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

+0

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

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

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

@ Durga, если это ответит на ваш вопрос, вы должны его принять. Узнайте больше о ставке приема здесь: http://meta.stackexchange.com/questions/16721/how-does-accept-rate-work – poncha

9

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

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

3

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

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

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

0

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

См яблоко документ для класса 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

Смежные вопросы