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.
Hai provato a utilizzare il debugger o la registrazione per determinare quali sono i risultati di 'NSStringFromClass' e' NSClassFromString'? –
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. –
Ho 'foo' su OS X e su iOS. Entrambe le stringhe sono la stessa classe privata di '__NSCFConstantString'. E usa 'NSLog();' invece di 'printf();' –