if([@"" class] == NSClassFromString(NSStringFromClass([@"" class])))
printf("foo");
else
printf("bar");
输出:富为什么在OS X上[@“”class]!= NSClassFromString(NSStringFromClass([@“”class]))?在iOS
输出在OS X:酒吧
为什么这个行为是奇怪在OS X?
if([@"" class] == NSClassFromString(NSStringFromClass([@"" class])))
printf("foo");
else
printf("bar");
输出:富为什么在OS X上[@“”class]!= NSClassFromString(NSStringFromClass([@“”class]))?在iOS
输出在OS X:酒吧
为什么这个行为是奇怪在OS X?
有趣的问题。下面指出在评论中提到的一些事情:
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
似乎是最好的选择。
您是否尝试过使用调试器或日志记录来确定'NSStringFromClass'和'NSClassFromString'的结果是什么? – 2013-05-07 16:47:10
根据NSString是否构造,静态定义等,我猜可能[概念上]'[@“”class]'有任何几个不同的值。Cocoa喜欢为同一个外部类创建多个内部类, iOS和OSx可能会有所不同。 – 2013-05-07 16:57:13
我在OS X和iOS上有'foo'。这两个字符串都是'__NSCFConstantString'的私有类。并且使用'NSLog();'而不是'printf();' – 2013-05-07 16:57:57