我聲明對象變量作爲NSString
但是,當我使用的XCode尋找到我的對象,我看到有兩個String類型的,好像是系統自動轉移到另一個:NSCFString和NSConstantString有什麼不同?
他們之間有什麼不同?它們是可以互換的嗎?另外,兩個條件變成另一個的條件是什麼?
謝謝。
我聲明對象變量作爲NSString
但是,當我使用的XCode尋找到我的對象,我看到有兩個String類型的,好像是系統自動轉移到另一個:NSCFString和NSConstantString有什麼不同?
他們之間有什麼不同?它們是可以互換的嗎?另外,兩個條件變成另一個的條件是什麼?
謝謝。
它們都是NSString
的具體子類。 __NSCFString
是在運行時通過Foundation或Core Foundation創建的,而__NSCFConstantString
是在編譯時創建的CFSTR("...")
常量或@"..."
常量。
它們的接口是私有的。對待他們都爲NSString
,你應該沒有問題。
如果您嘗試將兩個對象與isKindOfClass進行比較,將會遇到問題:只有在__NSCFConstantString爲接收器時纔會起作用。只是想告訴任何想知道這暗示的微妙之處的人。 – fjlksahfob 2013-03-26 20:16:01
'-isKindOfClass:'不用於對象比較,所以我不確定你在這裏獲得什麼。 – 2013-04-02 15:22:07
好吧,我用它,所以它幫助 – 2013-04-29 16:25:42
據我所知,NSCFConstantString
是一個NSString
的實現,它將字符串數據保存在代碼存儲器中。當您使用@"string"
常量時,編譯器會創建它的實例。由於子類/超類的關係,您可以在任何可以使用NSString
的地方使用NSCFConstantString
,但顯然不是相反。
它似乎是由編譯器完成的優化。我猜想,轉換爲NSCFConstantString
的字符串等於因性能原因而緩存的常量之一。您的NSCFString
只是一個免費的橋接字符串,可以是NSString
或CFString
。有關更多信息,請參閱this article。
一個轉化的NSString NSCFConstantString的好處就是下面的例子:
例如 - 在的tableView方法的cellForRowAtIndexPath如果你會寫
NSString *ident = @"identificator";
NSLog(@"%p", ident);
比這將是相同的地址每一個細胞。但與 NSLog(@「%p」,& ident)它將是每個單元格不同的地址。
的NSString IDENT = @「識別器」是一種特殊情況 - 它是作爲一個 __NSCFConstantString類創建,因此所有等同的字符串文字將共享 相同的存儲器地址,以優化存儲器的使用。 & ident將獲得一個指向NSString的局部變量的地址,並且將具有NFFtring **類型的 。
Reference來源(評論)。
我發現在Xcode調試器中爲UILabel變量__NSCFConstantString,當我偶然地將NSString *分配給UILabel *時 – sergtk 2014-02-11 12:15:49