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

輸出:富爲什麼在OS X上[@「」class]!= NSClassFromString(NSStringFromClass([@「」class]))?在iOS

輸出在OS X:酒吧

爲什麼這個行爲是奇怪在OS X?

+3

您是否嘗試過使用調試器或日誌記錄來確定'NSStringFromClass'和'NSClassFromString'的結果是什麼? – 2013-05-07 16:47:10

+0

根據NSString是否構造,靜態定義等,我猜可能[概念上]'[@「」class]'有任何幾個不同的值。Cocoa喜歡爲同一個外部類創建多個內部類, iOS和OSx可能會有所不同。 – 2013-05-07 16:57:13

+0

我在OS X和iOS上有'foo'。這兩個字符串都是'__NSCFConstantString'的私有類。並且使用'NSLog();'而不是'printf();' – 2013-05-07 16:57:57

回答

9

有趣的問題。下面指出在評論中提到的一些事情:

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"); 
} 

在Mac(OS X 10.7.5)這給:

2013年5月7日12:35:45.249測試[27483 :303] C1: '_ NSCFConstantString',C2: ' _NSCFConstantString'
2013年5月7日12:40:06.673試驗[27542:303] * C1: '0x7fff7d2bd740',* C2: '0x7fff7d28ae48'
2013-05-07 12:35:45.250測試[27483:303] ==不等於
2013-05-07 12:35:45.251測試[2 7483:303] isEqual:方法不等於
2013年5月7日12:35:45.251試驗[27483:303]名等於

在iOS(6.1)這給出:

2013- 05-07 12:38:11.816測試[27516:11303] c1:'_ NSCFConstantString',c2:' _NSCFConstantString'
2013-05-07 12:41:01.319測試[27557:11303] * c1:'' 0x1db88f8',* c2:'0x1db88f8'
2013-05-07 12:38:11.816測試[27516:11303] ==等於
2013-0十二月5日至7日:38:11.816試驗[27516:11303] isEqual:方法等於
2013年5月7日12:38:11.816試驗[27516:11303]名稱等於

關鍵的區別似乎是在iOS下,兩個Class值是相同的對象,但在OS X下它們是兩個不同的對象。

所以,現在看來,這是不是安全使用==isEqual:比較兩個Class值,至少在OS X中我找不到任何功能,比較兩個Class值,以便使用class_getName似乎是最好的選擇。

+0

我在OS X上得到了相同的類(相同的指針)(Tomasz Szulc在他對該問題的評論中報告)。 – 2013-05-07 19:48:02

+0

我應該指出我在OS X 10.7.5(Lion)下運行了我的測試。看起來10.8.x中的結果與10.7.x中的結果不同。 – rmaddy 2013-05-07 21:50:52

+1

使用isKindOf:與NSString進行比較。記住NSString是一個類集羣。 – uchuugaka 2013-05-08 01:29:26

相關問題