Differenza iOS tra isKindOfClass e isMemberOfClass


152

Qual è la differenza tra isKindOfClass:(Class)aClassle isMemberOfClass:(Class)aClassfunzioni e? So che è qualcosa di piccolo, uno è globale mentre l'altro è una corrispondenza esatta di classe, ma ho bisogno di qualcuno che specifichi quale è per favore.

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

Risposte:


264

isKindOfClass:restituisce YESse il destinatario è un'istanza della classe specificata o un'istanza di qualsiasi classe che eredita dalla classe specificata.

isMemberOfClass:restituisce YESif, e solo if, il destinatario è un'istanza della classe specificata.

Il più delle volte che si desidera utilizzare isKindOfClass:per assicurarsi che il codice funzioni anche con le sottoclassi.

Il riferimento al protocollo NSObject parla un po 'di più di questi metodi.


Potete per favore chiarire il mio dubbio qui sotto? 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:indica se un oggetto eredita da una determinata classe
  • isMemberOfClass:indica se un oggetto è un'istanza di una determinata classe.

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

@Durga, se questo risponde alla tua domanda, dovresti accettarlo. Maggiori informazioni sull'accettazione della tariffa qui: meta.stackexchange.com/questions/16721/…
poncha

1
isKindOfClass restituirà anche SÌ se l'oggetto è un'istanza di una determinata classe. In altre parole, isMemberOfClass è un sottoinsieme di isKindOfClass.
Scooter

48

supporre

@interface A : NSObject 
@end

@interface B : A
@end

...

id b = [[B alloc] init];

poi

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

Fondamentalmente, -isMemberOfClass:è vero se l'istanza è esattamente della classe specificata, mentre -isKindOfClass:è vera se l'istanza è esattamente della classe specificata o se uno degli antenati dell'istanza è della classe specificata.

-isMemberOfClass: viene usato raramente.


1
Ma se hai una serie di sottoview che includono UIVview e UISegmentedControl e le hai ripetute ciclicamente e hai impostato una condizione condizionale, dovrai usare isMemberOfClas UIView e isMemberOfClass UISegmentedControl per distinguerle, no? isKindOfClass vedrebbe UISegmentedControl come UIView.
PruitIgoe,

@Pruitlgoe è vero. È possibile utilizzare isKindOfClass: [classe UIView] per assicurarsi che tutti gli oggetti con cui si ha a che fare siano UIVview ma è necessario utilizzare isMemberOfClass: [classe UIView] e / o isMemberOfClass: [classe UISegmentedControl] all'interno di alcune istruzioni condizionali per indicare un'implementazione distinta delle opinioni basate sulla loro classe di istanza immediata
NoodleOfDeath

9

isKindOfClass : restituisce un valore booleano che indica se il destinatario è un'istanza di una determinata classe o un'istanza di qualsiasi classe che eredita da quella classe.

isMemberOfClass : restituisce un valore booleano che indica se il destinatario è un'istanza di una determinata classe.


2

isKindOfClass-> restituisce YES quando l'oggetto è un'istanza di quella classe o istanza di una classe che è ereditata da esso.

isMemberOfClass: restituisce YES quando l'oggetto è un'istanza di quella classe ma No nel caso: istanza di una classe ereditata da esso.

esempio è abbastanza buono nella risposta jtbandes.


0

A causa dei cluster di classe, isMemberOfClass può darti una risposta che potresti non aspettarti. In molti casi è più probabile che tu sia - (BOOL) conforme a Protocollo: (SEL) aSelector o - (BOOL) conforme a Protocollo: (Protocollo *) aProtocollo. Vale a dire, è meglio testarli se possono rispondere alle tue necessità piuttosto che testare la classe / sottoclasse.

Vedi apple doc per la classe e il protocollo 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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.