以下行實際上做了什麼?實際上用「=」分配一個文字字符串到NSString是什麼?
string = @"Some text";
假設 「串」 在頭部聲明正是如此:
NSString *string;
什麼是 「=」,其實在這裏做?它對「字符串」的引用計數有什麼作用?特別是,假設由於某種原因,「字符串」沒有被另外分配,它是否需要被釋放?
謝謝!
以下行實際上做了什麼?實際上用「=」分配一個文字字符串到NSString是什麼?
string = @"Some text";
假設 「串」 在頭部聲明正是如此:
NSString *string;
什麼是 「=」,其實在這裏做?它對「字符串」的引用計數有什麼作用?特別是,假設由於某種原因,「字符串」沒有被另外分配,它是否需要被釋放?
謝謝!
分配就是這樣。 string
指針基本上是一個指向內存中特定地址的標籤。重新分配語句會將該標籤指向內存中的另一個地址!
它不會更改引用計數或在Objective-C中執行任何操作。你需要保持引用計數自己,如果你是在非垃圾收集環境中運行:
[string release];
string = [@"Some text" retain];
但是,在字符串不需要進行管理,因爲他們得到靜態分配的,從來沒有得到解除了分配!所以release
和retain
方法只是NOOP(即沒有操作)。你可以放心地忽略它們。
當你在這種情況下使用文字時,它只是快速創建一個NSString對象的語法糖。一旦創建,對象的行爲就像另一個一樣。這裏的區別是你的字符串被編譯到程序中而不是動態創建。
以下行實際上做了什麼?
string = @"Some text";
假設 「串」 在頭部聲明正是如此:
NSString *string;
什麼是 「=」,其實在這裏做?它對「字符串」的引用計數有什麼作用?
string
不是字符串。
string
實際上並不是任何其他類型的可可物體。
string
是您創建的一個變量,用於保存NSString的實例。賦值運算符將某些內容放入變量*中。在你上面的例子中,你創建了一個文字字符串,並將其放入變量中。
由於string
是一個變量,而不是Cocoa對象,因此它沒有引用計數。
指定某處的對象可以擴展對象在垃圾收集代碼中的生存期(僅在Mac上)。有關更多詳細信息,請參閱the Memory Management Programming Guide for Cocoa。或者C數組。不要將這些與可可陣列混淆;它們不可互換,並且不能使用賦值操作符將東西放入Cocoa集合中(不管在Objective-C中,無論如何)。
謝謝!這是我對指針賦值的期望... ...啊,所以在賦值之後「-1」保留計數(即[string retainCount])是一個標誌,指示「字符串」指向字符串文字因此不需要管理,但可以安全地發佈? – notMyScreenName 2010-01-13 19:18:57
賦值後的「保留計數」爲-1表示您不應該注意任何對象的絕對保留計數。如果你保留它,你應該釋放它。就這些。那個@「」字符串不需要保留/釋放是一個實現細節,在技術上不應該依賴。但是,如果實施方式發生變化,每個人都會這樣做,一切都會中斷。 – bbum 2010-12-25 05:35:41