为什么是[@“”“ class]!= NSClassFromString(NSStringFromClass([@“”class])) [英] Why is [@"" class] != NSClassFromString(NSStringFromClass([@"" class])) on OS X?

查看:125
本文介绍了为什么是[@“”“ class]!= NSClassFromString(NSStringFromClass([@“”class]))的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  if([@class] == NSClassFromString(NSStringFromClass([@class])))
printf(foo);
else
printf(bar);

iOS上的输出:foo



在OS X:bar



为什么这种行为在OS X上很奇怪?

解决方案

有趣的问题。以下指出了注释中提到的一些事情:

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

//在iOS和OS X下的名称相同
NSLog(@c1:'%@',c2:'%@',c1,c2)
//指针在iOS下是​​相同的,但在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); // iOS和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:不等于

在iOS(6.1)上,这提供了:a。在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 值似乎不安全isEqual: / code>,至少在OS X下。我找不到任何函数来比较两个的值,所以使用 class_getName 似乎是最好的选择。


if([@"" class] == NSClassFromString(NSStringFromClass([@"" class])))
    printf("foo");
else
    printf("bar");

Output on iOS: foo

Output on OS X: bar

Why is this behaving that strange on OS X?

解决方案

Interesting issue. The following points out some things mentioned in the comments:

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

On a Mac (OS X 10.7.5) this gives:

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] == not equal
2013-05-07 12:35:45.251 Test[27483:303] isEqual: not equal
2013-05-07 12:35:45.251 Test[27483:303] name equal

On iOS (6.1) this gives:

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] == equal
2013-05-07 12:38:11.816 Test[27516:11303] isEqual: equal
2013-05-07 12:38:11.816 Test[27516:11303] name equal

The key difference seems to be that under iOS, the two Class values are the same object but under OS X they are two different objects.

So it seems it is not safe to compare two Class values using == or isEqual:, at least under OS X. I couldn't find any function to compare two Class values so using class_getName seems like the best alternative.

这篇关于为什么是[@“”“ class]!= NSClassFromString(NSStringFromClass([@“”class]))的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆