回答

20

分配就是這樣。 string指針基本上是一個指向內存中特定地址的標籤。重新分配語句會將該標籤指向內存中的另一個地址!

它不會更改引用計數或在Objective-C中執行任何操作。你需要保持引用計數自己,如果你是在非垃圾收集環境中運行:

[string release]; 
string = [@"Some text" retain]; 

但是,在字符串不需要進行管理,因爲他們得到靜態分配的,從來沒有得到解除了分配!所以releaseretain方法只是NOOP(即沒有操作)。你可以放心地忽略它們。

+0

謝謝!這是我對指針賦值的期望... ...啊,所以在賦值之後「-1」保留計數(即[string retainCount])是一個標誌,指示「字符串」指向字符串文字因此不需要管理,但可以安全地發佈? – notMyScreenName 2010-01-13 19:18:57

+5

賦值後的「保留計數」爲-1表示您不應該注意任何對象的絕對保留計數。如果你保留它,你應該釋放它。就這些。那個@「」字符串不需要保留/釋放是一個實現細節,在技術上不應該依賴。但是,如果實施方式發生變化,每個人都會這樣做,一切都會中斷。 – bbum 2010-12-25 05:35:41

0

當你在這種情況下使用文字時,它只是快速創建一個NSString對象的語法糖。一旦創建,對象的行爲就像另一個一樣。這裏的區別是你的字符串被編譯到程序中而不是動態創建。

2

以下行實際上做了什麼?

string = @"Some text"; 

假設 「串」 在頭部聲明正是如此:

NSString *string; 

什麼是 「=」,其實在這裏做?它對「字符串」的引用計數有什麼作用?

string不是字符串。

string實際上並不是任何其他類型的可可物體。

string是您創建的一個變量,用於保存NSString的實例。賦值運算符將某些內容放入變量*中。在你上面的例子中,你創建了一個文字字符串,並將其放入變量中。

由於string是一個變量,而不是Cocoa對象,因此它沒有引用計數。

指定某處的對象可以擴展對象在垃圾收集代碼中的生存期(僅在Mac上)。有關更多詳細信息,請參閱the Memory Management Programming Guide for Cocoa。或者C數組。不要將這些與可可陣列混淆;它們不可互換,並且不能使用賦值操作符將東西放入Cocoa集合中(不管在Objective-C中,無論如何)。

相關問題