if([@"" class] == NSClassFromString(NSStringFromClass([@"" class])))
printf("foo");
else
printf("bar");
iOS 上的输出:foo
OS X 上的输出:bar
为什么这在 OS X 上表现得那么奇怪?
if([@"" class] == NSClassFromString(NSStringFromClass([@"" class])))
printf("foo");
else
printf("bar");
iOS 上的输出:foo
OS X 上的输出:bar
为什么这在 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-05-07 12:35:45.249 测试[27483:303] c1:'_ NSCFConstantString',c2: '_NSCFConstantString '
2013-05-07 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 测试[27483:303] isEqual: 不等于
2013-05 -07 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-05-07 12:38:11.816 测试[27516:11303] isEqual: 等于
2013-05-07 12:38:11.816 测试[27516:11303] 名称相等
关键区别似乎在于,在 iOS 下,这两个Class
值是同一个对象,但在 OS X 下,它们是两个不同的对象。
Class
因此,使用==
or比较两个值似乎是不安全的isEqual:
,至少在 OS X 下是这样。我找不到任何函数来比较两个Class
值,所以 usingclass_getName
似乎是最好的选择。