3 回答

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

TA貢獻(xiàn)1860條經(jīng)驗(yàn) 獲得超9個(gè)贊
NSString *str = [[NSString alloc] initXXX
通常會(huì)分配一些RAM并返回一個(gè)指針。然后,該RAM將受到釋放和防護(hù)。但是,當(dāng)您這樣做時(shí):
NSString *str = [[NSString alloc] initWithString:@"Hello World"];
返回的字符串是@“ Hello World”,因?yàn)樗亲址淖?,所以已?jīng)分配了。由于它是字符串文字,因此無法釋放它,因此系統(tǒng)必須將其標(biāo)記為不可釋放。這樣做的方法是將其保留計(jì)數(shù)設(shè)置為最大整數(shù)值。
NString *str = [[NSString alloc] initWithFormat:@"Hello World. Today is @%", todayDate];
該字符串的keepCount為1。盡管其中有一個(gè)字符串常量,但該常量將附加到另一個(gè)字符串之后。由于您不能修改該常量字符串,因此將復(fù)制“ Hello World。”字符串,并將nowDate字符串的內(nèi)容添加到其中?,F(xiàn)在,該內(nèi)存已授予調(diào)用者所有權(quán),retainCount為1。

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超8個(gè)贊
為了節(jié)省一些可變開銷等,在編譯時(shí)將字符串優(yōu)化為靜態(tài)分配的NSString實(shí)例。您會(huì)看到如此高的保留計(jì)數(shù),因?yàn)殪o態(tài)字符串在您正在開發(fā)的任何平臺(tái)上都具有最大整數(shù)的保留計(jì)數(shù)。
- 3 回答
- 0 關(guān)注
- 613 瀏覽
添加回答
舉報(bào)