iOS-Unterschied zwischen isKindOfClass und isMemberOfClass

152

Was ist der Unterschied zwischen den isKindOfClass:(Class)aClassund den isMemberOfClass:(Class)aClassFunktionen? Ich weiß, dass es etwas Kleines ist, eines ist global, während das andere eine genaue Klassenübereinstimmung ist, aber ich brauche jemanden, der angibt, welches was ist.

In Swift isKind(of aClass: AnyClass)und isMember(of aClass: AnyClass).

Nudel des Todes
quelle

Antworten:

263

isKindOfClass:zurückkehrt , YESwenn der Empfänger eine Instanz der angegebenen Klasse oder eine Instanz einer Klasse , daß inherits von der angegebenen Klasse .

isMemberOfClass:Gibt YESgenau dann zurück, wenn der Empfänger eine Instanz der angegebenen Klasse ist.

Meistens möchten Sie isKindOfClass:sicherstellen, dass Ihr Code auch mit Unterklassen funktioniert.

In der NSObject-Protokollreferenz wird etwas mehr über diese Methoden gesprochen.

Sebastian Celis
quelle
Können Sie bitte meinen Zweifel klären? if ([lbl.textColor isMemberOfClass: [UIColor-Klasse]]) {// Not Memeber NSLog (@ "Not Memeber"); } else {NSLog (@ "Not Memeber"); } if ([imgView.image isMemberOfClass: [UIImage-Klasse]]) {// Memeber NSLog (@ "Memeber"); } else {NSLog (@ "Not Memeber"); }
Nikkie
82
  • isKindOfClass:Gibt an, ob ein Objekt von einer bestimmten Klasse erbt
  • isMemberOfClass:Gibt an, ob ein Objekt eine Instanz einer bestimmten Klasse ist.

[[NSMutableData data] isKindOfClass:[NSData class]]; // YES
[[NSMutableData data] isMemberOfClass:[NSData class]]; // NO
jtbandes
quelle
@ Durga, wenn dies deine Frage beantwortet, solltest du sie akzeptieren. Weitere Informationen zum
poncha
1
isKindOfClass gibt auch YES zurück, wenn das Objekt eine Instanz einer bestimmten Klasse ist. Mit anderen Worten ist isMemberOfClass eine Teilmenge von isKindOfClass.
Roller
48

Annehmen

@interface A : NSObject 
@end

@interface B : A
@end

...

id b = [[B alloc] init];

dann

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

Grundsätzlich -isMemberOfClass:gilt: Wenn die Instanz genau der angegebenen Klasse entspricht, -isKindOfClass:gilt dies, wenn die Instanz genau der angegebenen Klasse entspricht oder wenn einer der Vorfahren der Instanz der angegebenen Klasse angehört.

-isMemberOfClass: wird selten verwendet.

kennytm
quelle
1
Wenn Sie jedoch ein Array von Unteransichten haben, die UIViews und ein UISegmentedControl enthalten, und Sie diese durchlaufen und eine Bedingung für die Klasse festgelegt haben, müssen Sie isMemberOfClas UIView und isMemberOfClass UISegmentedControl verwenden, um zwischen ihnen zu unterscheiden, nein? isKindOfClass würde das UISegmentedControl als UIView sehen.
PruitIgoe
@Pruitlgoe das ist sehr wahr. Sie können isKindOfClass: [UIView-Klasse] verwenden, um sicherzustellen, dass alle Objekte, mit denen Sie sich befassen, UIViews sind. Sie müssen jedoch isMemberOfClass: [UIView-Klasse] und / oder isMemberOfClass: [UISegmentedControl-Klasse] in einer bedingten Anweisung verwenden, um eine bestimmte Implementierung anzugeben der Ansichten basierend auf ihrer unmittelbaren
Instanzklasse
9

isKindOfClass : Gibt einen booleschen Wert zurück, der angibt, ob der Empfänger eine Instanz einer bestimmten Klasse oder eine Instanz einer Klasse ist, die von dieser Klasse erbt.

isMemberOfClass : Gibt einen booleschen Wert zurück, der angibt, ob der Empfänger eine Instanz einer bestimmten Klasse ist.

Alex Terente
quelle
2

isKindOfClass-> gibt YES zurück, wenn das Objekt eine Instanz dieser Klasse oder eine Instanz einer Klasse ist, die von ihr geerbt wurde.

isMemberOfClass: Gibt YES zurück, wenn das Objekt eine Instanz dieser Klasse ist, aber Nein, falls: eine Instanz einer Klasse, die von ihr geerbt wurde.

Beispiel ist gut genug in jtbandes Antwort.

Ishu
quelle
0

Aufgrund von Klassenclustern kann isMemberOfClass Ihnen eine Antwort geben, die Sie möglicherweise nicht erwarten. In vielen Fällen ist es wahrscheinlicher, dass Ihre beste Wahl lautet: - (BOOL) entspricht dem Protokoll: (SEL) aSelector oder - (BOOL) entspricht dem Protokoll: (Protokoll *) entspricht dem Protokoll. Das heißt, es ist besser, diese zu testen, wenn sie Ihren Anforderungen entsprechen, als Klasse / Unterklasse zu testen.

Siehe Apple Doc für NSObject-Klasse und -Protokoll:

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

Art Swri
quelle