2010-04-07 83 views
4

的NSString讓我們假設myProp是@property(保留)的NSString * myProp爲我們合成....字符串或用繩子

self.myProp = @"some value";//string literal? 

self.myProp = [NSString stringWithString:@"some value"]; 

之間有區別嗎? 是第一個沒有獲得自動釋放的字符串字面值,還是僅僅在內存中,因爲它是當前的範圍,我不必擔心它?

+0

因爲這個掛起了很多人。 – 2010-04-07 17:11:14

+0

只要使用字符串文字,如果你不確定,他們總是正確的選擇。 – 2010-04-07 17:26:53

回答

4

您可能想花一些時間與String Programming Guide。從連接部分(有關創建@"string constants"):

這樣的對象是在編譯時 創建和整個 程序的執行存在。編譯器 在每個模塊基礎上使這些對象常量在 上唯一,並且它們從不從 解除分配,儘管您可以保留並且 釋放它們,就像您執行其他任何 對象一樣。

+0

謝謝,那就是我的想法。看起來我會繼續使用我的NSString對象。 – joels 2010-04-09 15:18:36

1

字符串文字是一個硬編碼的NSString,它在應用程序運行時無限期地存在。您甚至可以發送NSString響應的消息,例如[@"test" length]

要回答你的問題,第一行是將屬性設置爲字符串文字,而第二行是通過基於字符串文字創建新字符串的額外步驟。

1

要添加到約書亞和普雷斯頓的帖子,其實[NSString stringWithString:xxx]返回xxx本身,當xxx是一個文字。 這是一個實現細節,所以你不應該寫任何依賴這個事實的程序,但是知道這很有趣。

您可以檢查這個事實如此:

NSString*[email protected]"foo"; 
NSString*b=[NSString stringWithString:a]; 
NSLog(@"a at %p, class %@",a,[a class]); 
NSLog(@"b at %p, class %@",b,[b class]); 

至少在我的10.6.3中,都給予同樣的地址,與NSCFString類。

切記:retain & release關心您對所有權的責任,並且他們並不總是減少/增加保留計數。只要所述優化不打破所有權策略,該實現可以做任何它想要的優化。或者換句話說:寫retain & release這樣,如果實現總是保留計數的天真增加/減少,那麼這些對象將被保留/銷燬。這是Cocoa和你之間的合同。但可可可以做,並確實做了很多優化。