Diferença do iOS entre isKindOfClass e isMemberOfClass

152

Qual a diferença entre isKindOfClass:(Class)aClassas isMemberOfClass:(Class)aClassfunções e? Eu sei que é algo pequeno, um é global enquanto o outro é uma correspondência de classe exata, mas preciso que alguém especifique qual é qual, por favor.

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

NoodleOfDeath
fonte

Respostas:

264

isKindOfClass:retorna YESse o receptor for uma instância da classe especificada ou uma instância de qualquer classe que herda da classe especificada.

isMemberOfClass:retorna YESse, e somente se, o receptor é uma instância da classe especificada.

Na maioria das vezes você deseja usar isKindOfClass:para garantir que seu código também funcione com subclasses.

A referência de protocolo NSObject fala um pouco mais sobre esses métodos.

Sebastian Celis
fonte
Você pode limpar minha dúvida abaixo? 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 um objeto herda de uma determinada classe
  • isMemberOfClass:indica se um objeto é uma instância de uma determinada classe.

[[NSMutableData data] isKindOfClass:[NSData class]]; // YES
[[NSMutableData data] isMemberOfClass:[NSData class]]; // NO
jtbandes
fonte
@ Durga, se isso responder à sua pergunta, você deve aceitá-la. Leia mais sobre como aceitar taxas aqui: meta.stackexchange.com/questions/16721/…
poncha
1
isKindOfClass também retornará YES se o objeto for uma instância de uma determinada classe. Em outras palavras, isMemberOfClass é um subconjunto de isKindOfClass.
Scooter
48

Suponha

@interface A : NSObject 
@end

@interface B : A
@end

...

id b = [[B alloc] init];

então

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

Basicamente, -isMemberOfClass:é verdadeiro se a instância for exatamente da classe especificada, enquanto -isKindOfClass:é verdadeiro se a instância for exatamente da classe especificada ou se um dos ancestrais da instância for da classe especificada.

-isMemberOfClass: raramente é usado.

kennytm
fonte
1
Mas se você tiver uma matriz de subvisões que incluem UIViews e um UISegmentedControl e você as percorrer e definir uma condição na classe, você precisará usar isMemberOfClas UIView e isMemberOfClass UISegmentedControl para distinguir entre elas, não? isKindOfClass veria o UISegmentedControl como um UIView.
PruitIgoe
@Pruitlgoe isso é muito verdadeiro. Você pode usar isKindOfClass: [classe UIView] para garantir que todos os objetos com os quais você está lidando sejam UIViews, mas você precisará usar isMemberOfClass: [classe UIView] e / ou isMemberOfClass: [classe UISegmentedControl] dentro de alguma instrução condicional para indicar qualquer implementação distinta dos pontos de vista com base na sua classe instância imediato
NoodleOfDeath
9

isKindOfClass : Retorna um valor booleano que indica se o receptor é uma instância de uma determinada classe ou uma instância de qualquer classe que herda dessa classe.

isMemberOfClass : Retorna um valor booleano que indica se o receptor é uma instância de uma determinada classe.

Alex Terente
fonte
2

isKindOfClass-> retorna YES quando o objeto é instância dessa classe ou instância de uma classe que é herdada dele.

isMemberOfClass: retorna YES quando o objeto é instância dessa classe, mas No case: instância de uma classe que é herdada dela.

exemplo é bom o suficiente na resposta jtbandes.

Ishu
fonte
0

Devido aos clusters de classe, isMemberOfClass pode fornecer uma resposta que você não pode esperar. Em muitos casos, é mais provável que sua melhor opção seja - (BOOL) em conformidade com o protocolo: (SEL) aSeletor ou - (BOOL) em conformidade com o protocolo: (Protocolo *) aProtocolo. Ou seja, é melhor testá-los se eles puderem responder à sua necessidade, em vez de testar a classe / subclasse.

Consulte o documento da apple para obter a classe e o protocolo 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
fonte