isKindOfClassとisMemberOfClassのiOSの違い


152

違いは何であるisKindOfClass:(Class)aClassisMemberOfClass:(Class)aClassの機能は?私はそれが小さなもののようであることを知っています、一方はグローバルで、もう一方はクラスの完全一致ですが、どちらを指定するかを誰かに指定する必要があります。

Swift isKind(of aClass: AnyClass)およびisMember(of aClass: AnyClass)

回答:


264

isKindOfClass:戻りYES受信機があればインスタンスで指定されたクラスの、または任意のクラスのインスタンスは、その継承指定されたクラスから。

isMemberOfClass:YESレシーバ指定されたクラスのインスタンスである場合にのみ返します。

ほとんどの場合isKindOfClass:、コードがサブクラスでも機能するようにするために使用します。

NSObjectのプロトコルリファレンスは、これらのメソッドについてもう少し話しています。


以下の疑問を解決していただけますか?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、

82
  • isKindOfClass:オブジェクトが特定のクラスから継承するかどうかを示します
  • isMemberOfClass:オブジェクト特定のクラスのインスタンスであるかどうかを示します

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

@Durga、これがあなたの質問に答えるなら、あなたはそれを受け入れるべきです。受入率の詳細については、こちらをご覧ください:meta.stackexchange.com/questions/16721/…– poncha
1

1
isKindOfClassは、オブジェクトが特定のクラスのインスタンスである場合にもYESを返します。つまり、isMemberOfClassはisKindOfClassのサブセットです。
スクーター

48

と思います

@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:ある場合はtrue、インスタンスが指定したクラスのものであるか、インスタンスの祖先の1つが指定したクラスのものである場合はtrueです。

-isMemberOfClass: めったに使用されません。


1
しかし、UIViewsとUISegmentedControlを含むサブビューの配列があり、それらをループしてクラスに条件を設定した場合、isMemberOfClas UIViewとisMemberOfClass UISegmentedControlを使用してそれらを区別する必要がありますか?isKindOfClassは、UISegmentedControlをUIViewとして認識します。
PruitIgoe 2013

@Pruitlgoe非常に真実です。isKindOfClass:[UIView class]を使用して、処理するすべてのオブジェクトが確実にUIViewsであることを確認できますが、いくつかの条件付きステートメント内でisMemberOfClass:[UIView class]またはisMemberOfClass:[UISegmentedControl class]を使用して、異なる実装を示す必要があります。の即時インスタンスクラスに基づくビューの例
NoodleOfDeath 14

9

isKindOfClass:レシーバーが特定のクラスのインスタンスであるか、そのクラスから継承する任意のクラスのインスタンスであるかを示すブール値を返します。

isMemberOfClass:レシーバーが指定されたクラスのインスタンスであるかどうかを示すブール値を返します。


2

isKindOfClass->オブジェクトがそのクラスのインスタンスまたはそれから継承されたクラスのインスタンスである場合、YESを返します。

isMemberOfClass:オブジェクトがそのクラスのインスタンスである場合はYESを返しますが、場合:いいえから継承されたクラスのインスタンスです。

例はjtbandesの答えで十分です。


0

クラスクラスターがあるため、isMemberOfClassは予想外の答えを与える可能性があります。多くの場合、最適な選択は-(BOOL)conformsToProtocol:(SEL)aSelectorまたは-(BOOL)conformsToProtocol:(Protocol *)aProtocolです。つまり、クラス/サブクラスをテストするよりも、ニーズに応えられる場合はこれらをテストする方が良いでしょう。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.