2010-09-06 13 views

Odpowiedz

238

isKindOfClass: zwraca TAK, jeśli odbiorca jest instancją określonej klasy lub instancją dowolnej klasy dziedziczącej z określonej klasy.

isMemberOfClass: zwraca TAK, jeśli odbiorca jest wystąpieniem określonej klasy.

Zazwyczaj używa się isKindOfClass:, aby upewnić się, że twój kod działa również z podklasami.

The NSObject Protocol Reference mówi trochę więcej o tych metodach.

+0

Czy należy oczyścić poniżej wątpliwości? 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

44

Załóżmy

@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: jest prawdą, jeśli instancja jest dokładnie określonej klasy, natomiast -isKindOfClass: jest prawdą, jeśli instancja jest dokładnie określonej klasy lub jeśli jeden z przodków instancji jest określonej klasy.

-isMemberOfClass: jest rzadko używany.

+1

Ale jeśli masz tablicę subviews, które zawierają UIViews i UISegmentedControl, a ty przełączyłeś je i ustawiłeś warunek dla klasy, musisz użyć isMemberOfClas UIView i isMemberOfClass UISegmentedControl, aby je rozróżnić, nie? isKindOfClass zobaczy UISegmentedControl jako UIView. – PruitIgoe

+0

@Pruitlgoe to jest bardzo prawdziwe. Możesz użyć isKindOfClass: [klasa UIView], aby upewnić się, że wszystkie obiekty, z którymi masz do czynienia, to UIViews, ale musisz użyć isMemberOfClass: [klasa UIView] i/lub isMemberOfClass: [klasa UISegmentedControl] w pewnym warunkowym komunikacie, aby wskazać jakąkolwiek odrębną implementację z widoków opartych na ich bezpośredniej instancji klasy –

73
  • isKindOfClass: wskazuje, czy obiekt dziedziczy z danej klasy
  • isMemberOfClass: wskazuje, czy obiekt jest wystąpienie danej klasy.

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

@Durga, jeśli to odpowiada na twoje pytanie, powinieneś to zaakceptować. Przeczytaj więcej o akceptowaniu kursu tutaj: http://meta.stackexchange.com/questions/16721/how-does-accept-rate-work – poncha

9

isKindOfClass: zwraca wartość logiczną, która wskazuje, czy odbiornik jest wystąpienie określonej klasy lub wystąpienie jakiejkolwiek klasy która dziedziczy z tej klasy.

isMemberOfClass: Zwraca wartość logiczną wskazującą, czy odbiornik jest instancją danej klasy.

3

isKindOfClass-> return YES, gdy obiekt jest instancją tej klasy lub instancji klasy, która jest z niego dziedziczona.

isMemberOfClass: return YES, 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.

0

Z powodu klastrów klas, isMemberOfClass może dać odpowiedź, której możesz nie oczekiwać.W wielu przypadkach najlepszym wyborem będzie - (BOOL) conformsToProtocol: (SEL) aSelector lub - (BOOL) conformsToProtocol: (Protocol *) aProtocol. Lepiej przetestować te, jeśli mogą one odpowiedzieć na twoje potrzeby, a nie na testowanie klasy/podklasy.

See jabłko doc dla klasy NSObject i protokołu:

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