2013-05-07 6 views
10
if([@"" class] == NSClassFromString(NSStringFromClass([@"" class]))) 
    printf("foo"); 
else 
    printf("bar"); 

uscita su iOS: fooPerché [@ "" class]! = NSClassFromString (NSStringFromClass ([@ "" class])) su OS X?

uscita su OS X: bar

Perché questo è un comportamento strano che su OS X?

+3

Hai provato a utilizzare il debugger o la registrazione per determinare quali sono i risultati di 'NSStringFromClass' e' NSClassFromString'? –

+0

Direi che '[@" "classe]' potrebbe (concettualmente) avere diversi valori diversi, a seconda che la NSString sia costruita, definita staticamente, ecc. Cocoa adora avere più classi interne per la stessa esterna, e probabilmente questi sono diversi tra iOS e OSx. –

+0

Ho 'foo' su OS X e su iOS. Entrambe le stringhe sono la stessa classe privata di '__NSCFConstantString'. E usa 'NSLog();' invece di 'printf();' –

risposta

9

Interessante. sottolinea il seguente alcune cose menzionate nei commenti:

Class c1 = [@"" class]; 
Class c2 = NSClassFromString(NSStringFromClass([@"" class])); 

// The names are the same under iOS and OS X 
NSLog(@"c1: '%@', c2: '%@'", c1, c2); 
// The pointers are the same under iOS but different under OS X 
NSLog(@"*c1: '%p', *c2: '%p'", c1, c2); 

if (c1 == c2) { 
    NSLog(@"== equal"); // iOS 
} else { 
    NSLog(@"== not equal"); // OS X 
} 

if ([c1 isEqual:c2]) { 
    NSLog(@"isEqual: equal"); // iOS 
} else { 
    NSLog(@"isEqual: not equal"); // OS X 
} 

const char *n1 = class_getName(c1); 
const char *n2 = class_getName(c2); 
if (strcmp(n1, n2) == 0) { 
    NSLog(@"name equal"); // Both iOS and OS X 
} else { 
    NSLog(@"name not equal"); 
} 

Su un Mac (OS X 10.7.5) questo dà:

2013-05-07 12: 35: 45,249 Test [27483 : 303] c1: '_ NSCFConstantString', c2: ' _NSCFConstantString'
2013/05/07 12: 40: 06,673 test [27542: 303] * c1: '0x7fff7d2bd740', * c2: '0x7fff7d28ae48'
2013-05-07 12: 35: 45.250 Test [27483: 303] == non uguale
2013-05-07 12: 35: 45.251 Test [2 7483: 303] IsEqual: non uguale
2013/05/07 12: 35: 45,251 Test [27483: 303] nome uguale

Su iOS (6.1) questo dà:

2013- 05-07 12: 38: 11.816 Test [27516: 11303] c1: '_ NSCFConstantString', c2: ' _NSCFConstantString'
2013-05-07 12: 41: 01.319 Test [27557: 11303] * c1: ' 0x1db88f8 ', * c2:' 0x1db88f8 '
2013-05-07 12: 38: 11.816 Test [27516: 11303] == uguale
2013-0 5-7 Dicembre: 38: 11,816 Test [27516: 11303] IsEqual: pari
2013/05/07 12: 38: 11,816 Test [27516: 11303] nome uguale

La differenza principale sembra essere il fatto che sotto iOS, i due valori Class sono lo stesso oggetto ma sotto OS X sono due oggetti diversi.

Così sembra che non è sicuro per confrontare due Class valori utilizzando == o isEqual:, almeno sotto OS X. non ho potuto trovare alcuna funzione per confrontare due Class valori in modo da utilizzare class_getName sembra la migliore alternativa.

+0

Ottengo le stesse classi (puntatori identici) su OS X (come ha riferito Tomasz Szulc nel suo commento alla domanda). –

+0

Avrei dovuto sottolineare che ho eseguito il mio test su OS X 10.7.5 (Lion). Sembra che i risultati in 10.8.x siano diversi rispetto a 10.7.x. – rmaddy

+1

Usa isKindOf: per confrontare con NSString. Ricorda che NSString è un cluster di classi. – uchuugaka