3 回答

TA貢獻1796條經驗 獲得超4個贊
編譯器比您更聰明。
它看到@"Hello world"
并想到“??!一個不變的弦!”
然后[[NSString alloc] initWithString:@"Hello world!"]
,它會想到“ Aha!一個用常量字符串創建的不可變對象!”。
然后,將它們都折疊為一個NSConstantString
具有retainCount
的UINT_MAX
,從而永遠無法釋放它。

TA貢獻1860條經驗 獲得超9個贊
NSString *str = [[NSString alloc] initXXX
通常會分配一些RAM并返回一個指針。然后,該RAM將受到釋放和防護。但是,當您這樣做時:
NSString *str = [[NSString alloc] initWithString:@"Hello World"];
返回的字符串是@“ Hello World”,因為它是字符串文字,所以已經分配了。由于它是字符串文字,因此無法釋放它,因此系統必須將其標記為不可釋放。這樣做的方法是將其保留計數設置為最大整數值。
NString *str = [[NSString alloc] initWithFormat:@"Hello World. Today is @%", todayDate];
該字符串的keepCount為1。盡管其中有一個字符串常量,但該常量將附加到另一個字符串之后。由于您不能修改該常量字符串,因此將復制“ Hello World。”字符串,并將nowDate字符串的內容添加到其中。現在,該內存已授予調用者所有權,retainCount為1。

TA貢獻1824條經驗 獲得超8個贊
為了節省一些可變開銷等,在編譯時將字符串優化為靜態分配的NSString實例。您會看到如此高的保留計數,因為靜態字符串在您正在開發的任何平臺上都具有最大整數的保留計數。
- 3 回答
- 0 關注
- 607 瀏覽
添加回答
舉報