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).

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.


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

@ 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.


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.


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.


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.