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

Çıktı: fooNeden OS X'de [@ "" class]! = NSClassFromString (NSStringFromClass ([@ "" class]))? iOS'ta

Çıktı OS X üzerinde: çubuk

Neden bu davranıyor OS X gariptir?

+3

'NSStringFromClass' ve' NSClassFromString' sonuçlarının ne olduğunu belirlemek için hata ayıklayıcısını kullanarak veya günlüğe kaydetmeyi denediniz mi? –

+0

"[@" "sınıfının" NSString'in oluşturulup oluşturulmadığına, statik olarak tanımlanıp tanımlanmadığına bağlı olarak birkaç farklı değere sahip olabileceğini tahmin ediyorum. Kakao, aynı dışsal için birden fazla iç sınıfa sahip olmayı çok seviyor ve muhtemelen bunlar iOS ve OSx arasında farklıdır. –

+0

OS X'de ve iOS'ta 'foo' var. Her iki dizge de '__NSCFConstantString' özel sınıfının aynısıdır. 'Printf();' –

cevap

9

İlginç bir sorun. 35:

2013-05-07 12: Mac (OS X 10.7.5) Bu verir On

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

: Aşağıdaki yorum olarak bahsedilen bazı şeyleri işaret 45,249 Testi [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] == eşit değil
2013-05-07 12: 35: 45.251 Test [2 7483: 303] IsEqual: eşit değildir 2013/05/07 12
: 35: 45,251 test [27483: Eşit 303] adı

IOS üzerinde

(6,1), bu verir:

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] == eşit
2013-0 05-07 Aralık: 38: 11.816 test [27516: 11303] IsEqual: Eşit
2013/05/07 12: 38: 11.816 test [27516: 11303] adı eşittir

temel fark olduğu görülmektedir iOS altında, iki Class değeri aynı nesnedir, ancak OS X altında iki farklı nesne vardır.

Yani o yüzden class_getName iyi bir alternatif gibi görünüyor kullanarak iki Class değerleri karşılaştırmak için herhangi bir işlev bulamadık en azından OS X altında == veya isEqual: kullanarak iki Class değerleri karşılaştırmak için güvenli değildir görünüyor.

+0

OS X'de aynı sınıfları (aynı işaretçiler) elde ediyorum (Tomasz Szulc'ın bu soruya yaptığı yorumda bildirdiği gibi). –

+0

Testimi OS X 10.7.5 (Lion) altında çalıştırdığımı belirtmeliydim. Görünüşe göre 10.8.x'deki sonuçlar 10.7.x'ten farklıdır. – rmaddy

+1

Kullanım isKindOf: NSString ile karşılaştırmak. Unutmayın NSString bir sınıf kümesidir. – uchuugaka

İlgili konular