2012-04-19 28 views
9

我聲明對象變量作爲NSString 但是,當我使用的XCode尋找到我的對象,我看到有兩個String類型的,好像是系統自動轉移到另一個:NSCFString和NSConstantString有什麼不同?

enter image description here

他們之間有什麼不同?它們是可以互換的嗎?另外,兩個條件變成另一個的條件是什麼?

謝謝。

+0

我發現在Xcode調試器中爲UILabel變量__NSCFConstantString,當我偶然地將NSString *分配給UILabel *時 – sergtk 2014-02-11 12:15:49

回答

12

它們都是NSString的具體子類。 __NSCFString是在運行時通過Foundation或Core Foundation創建的,而__NSCFConstantString是在編譯時創建的CFSTR("...")常量或@"..."常量。

它們的接口是私有的。對待他們都爲NSString,你應該沒有問題。

+8

如果您嘗試將兩個對象與isKindOfClass進行比較,將會遇到問題:只有在__NSCFConstantString爲接收器時纔會起作用。只是想告訴任何想知道這暗示的微妙之處的人。 – fjlksahfob 2013-03-26 20:16:01

+0

'-isKindOfClass:'不用於對象比較,所以我不確定你在這裏獲得什麼。 – 2013-04-02 15:22:07

+2

好吧,我用它,所以它幫助 – 2013-04-29 16:25:42

2

據我所知,NSCFConstantString是一個NSString的實現,它將字符串數據保存在代碼存儲器中。當您使用@"string"常量時,編譯器會創建它的實例。由於子類/超類的關係,您可以在任何可以使用NSString的地方使用NSCFConstantString,但顯然不是相反。

3

它似乎是由編譯器完成的優化。我猜想,轉換爲NSCFConstantString的字符串等於因性能原因而緩存的常量之一。您的NSCFString只是一個免費的橋接字符串,可以是NSStringCFString。有關更多信息,請參閱this article

0

一個轉化的NSString NSCFConstantString的好處就是下面的例子:

例如 - 在的tableView方法的cellForRowAtIndexPath如果你會寫

NSString *ident = @"identificator"; 
NSLog(@"%p", ident); 

比這將是相同的地址每一個細胞。但與 NSLog(@「%p」,& ident)它將是每個單元格不同的地址。

的NSString IDENT = @「識別器」是一種特殊情況 - 它是作爲一個 __NSCFConstantString類創建,因此所有等同的字符串文字將共享 相同的存儲器地址,以優化存儲器的使用。 & ident將獲得一個指向NSString的局部變量的地址,並且將具有NFFtring **類型的 。

Reference來源(評論)。

相關問題