isKindOfClass:(Class)aClass
関数とisMemberOfClass:(Class)aClass
関数の違いは何ですか? 1つはグローバルで、もう1つはクラスに完全に一致するような小さなものであることは知っていますが、どちらを喜ばせるかを指定する必要があります。
In Swift isKind(of aClass: AnyClass)
およびisMember(of aClass: AnyClass)
。
isKindOfClass:
は、レシーバーがYES
を返します指定されたクラスのインスタンスまたは指定されたクラスから継承であるクラスのインスタンスクラス。
isMemberOfClass:
は、指定されたクラスのレシーバーインスタンスの場合にのみ、YES
を返します。
ほとんどの場合、isKindOfClass:
コードがサブクラスでも機能することを確認します。
NSObject Protocol Reference は、これらのメソッドについてもう少し詳しく説明しています。
isKindOfClass:
は、オブジェクトが継承であるかどうかを示しますisMemberOfClass:
は、オブジェクトのインスタンス指定されたクラスであるかどうかを示します。[[NSMutableData data] isKindOfClass:[NSData class]]; // YES
[[NSMutableData data] isMemberOfClass:[NSData class]]; // NO
仮に
@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:
は、インスタンスが指定されたクラスのものである場合、またはインスタンスの祖先の1つが指定されたクラスのものである場合にtrueです。
-isMemberOfClass:
はほとんど使用されません。
isKindOfClass:受信者が特定のクラスのインスタンスであるか、継承するクラスのインスタンスであるかを示すブール値を返しますそのクラスから。
isMemberOfClass:受信者が特定のクラスのインスタンスであるかどうかを示すブール値を返します。
isKindOfClass->は、オブジェクトがそのクラスのインスタンスまたはそれから継承されたクラスのインスタンスである場合にYESを返します。
isMemberOfClass:オブジェクトがそのクラスのインスタンスである場合はYESを返しますが、その場合はNoを継承します。
jtbandesの回答では例で十分です。
クラスクラスターのため、isMemberOfClassは、予想外の答えを提供できます。多くの場合、最良の選択は BOOL)conformsToProtocol:(SEL)aSelectorまたは-(BOOL)conformsToProtocol:(Protocol *)aProtocolである可能性が高くなります。つまり、クラス/サブクラスをテストするよりも、ニーズに応えることができる場合は、これらをテストする方が良いでしょう。
NSObjectクラスとプロトコルについては、Apple doc:
---(http://developer.Apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//Apple_ref/occ/cl/NSObject