Różnica między isKindOfClass i isMemberOfClass w systemie iOS

152

Jaka jest różnica między isKindOfClass:(Class)aClassa isMemberOfClass:(Class)aClassfunkcji? Wiem, że jest to coś małego, na przykład, jedno jest globalne, a drugie jest dokładnym dopasowaniem klasy, ale potrzebuję kogoś, kto określi, która jest odpowiednia.

W Swift isKind(of aClass: AnyClass)i isMember(of aClass: AnyClass).

NoodleOfDeath
źródło

Odpowiedzi:

264

isKindOfClass:zwraca, YESjeśli odbiornik jest instancją określonej klasy lub instancją dowolnej klasy, która dziedziczy po określonej klasie.

isMemberOfClass:zwraca YESjeśli i tylko wtedy, gdy odbiorca jest wystąpienie określonej klasy.

Przez większość czasu chcesz używać isKindOfClass: pewność, że kod działa również z podklasami.

Dokumentacja protokołu NSObject mówi trochę więcej o tych metodach.

Sebastian Celis
źródło
Czy możesz wyjaśnić moje poniższe wątpliwości? if ([lbl.textColor isMemberOfClass: [klasa UIColor]]) {// Not Memeber NSLog (@ "Not Memeber"); } else {NSLog (@ "Not Memeber"); } if ([imgView.image isMemberOfClass: [klasa UIImage]]) {// Memeber NSLog (@ "Memeber"); } else {NSLog (@ "Not Memeber"); }
Nikkie,
82
  • isKindOfClass:wskazuje, czy obiekt dziedziczy z danej klasy
  • isMemberOfClass:wskazuje, czy obiekt jest instancją danej klasy.

[[NSMutableData data] isKindOfClass:[NSData class]]; // YES
[[NSMutableData data] isMemberOfClass:[NSData class]]; // NO
jtbandes
źródło
@Durga, jeśli to odpowiada na twoje pytanie, powinieneś je zaakceptować. Przeczytaj więcej o akceptowaniu kursu tutaj: meta.stackexchange.com/questions/16721/…
poncha
1
isKindOfClass również zwróci TAK, jeśli obiekt jest instancją danej klasy. Innymi słowy, isMemberOfClass jest podzbiorem isKindOfClass.
Scooter
48

Przypuszczać

@interface A : NSObject 
@end

@interface B : A
@end

...

id b = [[B alloc] init];

następnie

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

Zasadniczo -isMemberOfClass:ma wartość true, jeśli instancja należy dokładnie do określonej klasy, a -isKindOfClass:true, jeśli instancja należy dokładnie do określonej klasy lub jeśli jeden z przodków instancji należy do określonej klasy.

-isMemberOfClass: jest rzadko używany.

kennytm
źródło
1
Ale jeśli masz tablicę podglądów podrzędnych, które zawierają UIViews i UISegmentedControl, i przeszedłeś przez nie i ustawiłeś warunek na klasę, musisz użyć isMemberOfClas UIView i isMemberOfClass UISegmentedControl, aby je rozróżnić, nie? isKindOfClass zobaczy UISegmentedControl jako UIView.
PruitIgoe
@Pruitlgoe, to jest bardzo prawdziwe. Możesz użyć isKindOfClass: [UIView class], aby upewnić się, że wszystkie obiekty, z którymi masz do czynienia, są UIViews, ale musisz użyć isMemberOfClass: [UIView class] i / lub isMemberOfClass: [UISegmentedControl class] wewnątrz jakiejś instrukcji warunkowej, aby wskazać jakąkolwiek odrębną implementację wyświetleń w oparciu o klasę ich bezpośredniej instancji
NoodleOfDeath
9

isKindOfClass : Zwraca wartość logiczną, która wskazuje, czy odbiornik jest instancją danej klasy, czy instancją dowolnej klasy, która dziedziczy po tej klasie.

isMemberOfClass : zwraca wartość logiczną, która wskazuje, czy odbiorca jest instancją danej klasy.

Alex Terente
źródło
2

isKindOfClass-> return YES, gdy obiekt jest instancją tej klasy lub instancją klasy, która jest po niej dziedziczona.

isMemberOfClass: zwraca TAK, gdy obiekt jest instancją tej klasy, ale nie w przypadku: instancja klasy, która jest z niej dziedziczona.

przykład jest wystarczająco dobry w odpowiedzi jtbandes.

Ishu
źródło
0

Ze względu na klastry klas isMemberOfClass może udzielić odpowiedzi, której możesz się nie spodziewać. W wielu przypadkach najlepszym wyborem będzie prawdopodobnie - (BOOL) complsToProtocol: (SEL) aSelector lub - (BOOL) complsToProtocol: (Protocol *) aProtocol. To znaczy, lepiej je przetestować, jeśli mogą odpowiedzieć na twoje potrzeby, niż testować klasę / podklasę.

Zobacz dokumentację Apple dla klasy i protokołu 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

Art Swri
źródło