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

出力:OS X上のfooOS Xの[@ "" class]!= NSClassFromString(NSStringFromClass([@ "" class]))はなぜですか? iOSの

出力:

はなぜ、このOS X上でその奇妙な動作しているバー?

+3

デバッガまたはログを使って、 'NSStringFromClass'と' NSClassFromString'の結果が何であるかを調べてみましたか? –

+0

私は、NSStringが構築され静的に定義されているかどうかに応じて、(概念的に)いくつかの異なる値を持つことができると思います.Cocoaは同じ外部クラスに対して複数の内部クラスを持つことが大好きです。これらはiOSとOSxで異なる可能性があります。 –

+0

OS XとiOSで「foo」を取得しました。両方の文字列は '__NSCFConstantString'の同じプライベートクラスです。 –

答えて

9

興味深い問題です。これが与えるマック(OS X 10.7.5)で

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

::35::

2013年5月7日12 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:35:
2013年5月7日12等しくない45.251試験[27483:IOSの(6.1)で303]名等しい

これが与える:

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日12:38:11.816試験[27516:11303]のisEqual:等しい
2013年5月7日12:38:11.816試験[27516:11303]名等しい

主な違いは、ことであると思われますiOSでは、2つのClassの値は同じオブジェクトですが、OS Xでは2つの異なるオブジェクトです。

だから、そうclass_getNameを使用することが最善の選択肢のように思える少なくともOS Xの下、私は2つのClass値を比較するために、任意の関数を見つけることができなかった、==またはisEqual:を使用して2つのClass値を比較するのは安全ではないようです。

+0

私はOS X上で同じクラス(同一のポインタ)を取得します(Tomasz Szulc氏が彼のコメントで報告したように)。 –

+0

私はOS X 10.7.5(Lion)でテストを実行したことを指摘しておきました。 10.8.xの結果と10.7.xの結果が異なるようです。 – rmaddy

+1

isKindOf:を使用してNSStringと比較します。 NSStringはクラスクラスターであることを忘れないでください。 – uchuugaka

関連する問題