2009-08-13 22 views
7

He siguiente fragmento de códigonombre de clase y mensajes isKindOfClass enviados a un objeto

NSMutableArray *mutArray = [[NSMutableArray alloc] init]; 
[mutArray addObject: [NSProcessInfo processInfo]]; 
[mutArray addObject: @"This is NSString Object"]; 
[mutArray addObject: [[NSMutableString alloc] initWithString: @"1st Mutable String"]]; 

for (id element in mutArray){ 
     NSLog(@" "); 
     NSLog(@"Class Name: %@", [element className]); 
     NSLog(@"Is Member of NSString: %@", ([element class] isMemberOfClass: [NSString class]) ? YES: NO); 
     NSLog(@"Is kind of NSString: %@", ([element class] isKindOfClass: [NSString class]) ? YES: NO); 
} 

estoy consiguiendo siguiente salida (y esperando como puntas)

Class Name: NSProcessInfo 
Is Member of NSString: NO 
Is Kind of NSString: NO 

Class Name: NSCFString   <-- Expecting NSString 
Is Member of NSString: NO  <-- Expecting YES 
Is Kind of NSString: NO  <-- Expecting YES 

Class Name: NSCFString   <-- Expecting NSMutableString 
Is Member of NSString: NO  
Is Kind of NSString: NO  <-- Expecting YES 

Me estoy perdiendo algo terrible simple aquí? ¡Gracias!

Respuesta

16

Uso:

[element isMemberOfClass: [NSString class]] 
No

:

[[element class] isMemberOfClass: [NSString class]] 

NSString y NSMutableString se implementan como un class cluster (consulte "Objetos de Cuerda" en el iPhone version of the documentation).

Así isKindOfClass: debería devolver verdadero pero isMemberOfClass: devolverá falso ya que NSString no es el tipo exacto del objeto.

+0

nice catch :) ... gracias! – Dev

2

NSString se compone de un conjunto de clases. También están libres de puente con CFString s (desde CoreFoundation). Es muy probable que en algún lugar de la implementación de NSString aparezca NSCFString (no conozco todos los hechos, pero mi deducción aquí es que esta clase actúa como puente).

+0

Entonces, si queremos hacer alguna instrospección, ¿deberíamos estar realmente comprobando contra NSCFString? – Dev

+0

es decir, para objetos de clase NSString y NSMutableString? – Dev

Cuestiones relacionadas