2011-11-06 17 views
0

當一個類進行自省,我使用下面的代碼:目標C自省

if([object isKindOfClass:[NSNumber class]]){ 

     NSLog(@"I am an NSNumber: %@", object); 
    } 

NSLog(@"Properties:%@", [object class]); 

輸出是:

I am an NSNumber: 320 
Properties:__NSCFNumber 

任何人都可以解釋爲什麼結果是__NSCFNumber類型的NSNumber?我也注意到NSArray中被確定爲:

__NSArrayI 

回答

6

NSNumberclass cluster. NSNumber是幾個具體子類的抽象公共超類。當您使用任何+numberWith...方法創建NSNumber時,您將獲得其中一個子類的實例。

當傳遞一個對象到的NSLog()爲對應於「%@」存儲指定符的參數,NSLog()將發送對象-description消息,並且插入件無論從該消息表達式返回到其寫入字符串的stderr文件描述符。

+1

另外,我會想''__NSCFNumber'具體來自'NSNumber'和'CFNumber'之間的免費橋接。類似的結果來自'[@「」class]'('__NSCFString')。 –

+1

還有「免費橋接」,它說明了有趣的NSCFNumber類名,因爲在Objective-C環境(NS)和Core Foundation環境(CF)中實質上存在相同的類,並且兩者可以互換使用。 –

+0

謝謝 - 這是有道理的。我來自Java和C#背景,它基本上就像「編程到界面」(如果我理解正確的話)。 – PhillyNJ

0

我不能直接回答你的問題,我可以告訴你的是,你可以這樣做:

[email protected]"Class name: %@.", NSStringFromClass([object class]); 

而且你會得到:

Class name: NSNumber. 

對您有幫助嗎?

4

__NSCFNumber私人小類NSNumber。您不必擔心內部使用了哪些特定的類,這是操作系統用來提高性能的實現細節。

有許多類使用此模式(它被稱爲Class Cluster),其中包括NSStringNSArray

由於類型/實現可能(而且確實)經常更改,因此不太推薦使用實際類型。只要把它當作NSNumber,你應該就好了!