我們先修改一下一下NSLog 以方便后面驗(yàn)證
宏定義 :
define TLog(_var)({NSString *name = @#_var; NSLog(@"%@: %@ -> %p:%@",name,[_var class],_var,_var);})
NSString有三種
NSCFConstantString (常量string)
該類(lèi)型的字符串存放在常量區(qū),retain 或者release不影響應(yīng)用計(jì)數(shù)。
我們用的字面量語(yǔ)法(NSSting *str = @"Hello world";)創(chuàng)建的都是這個(gè)類(lèi)型的string
可以用宏定義測(cè)試NSCFString (普通string)
該類(lèi)型的string和普通對(duì)象一樣勾邦,存在堆上且改,有正常的引用計(jì)數(shù)。
- NSTaggedPointerString (便簽指針string)
蘋(píng)果在64位環(huán)境下對(duì)NSString和NSNumber做了優(yōu)化誊稚,將長(zhǎng)度較小的字符串直接存放在指針里面,省去了在堆內(nèi)存開(kāi)辟空間。對(duì)于NSString粪狼,當(dāng)非字面量的數(shù)字退腥,英文字母字符串的長(zhǎng)度小于等于9的時(shí)候會(huì)自動(dòng)成為NSTaggedPointerString類(lèi)型;當(dāng)長(zhǎng)度大于9或者有中文在里面就會(huì)變成NSCFString該類(lèi)型再榄。便簽指針string內(nèi)容存在指針中狡刘,沒(méi)有對(duì)象釋放,所以也不會(huì)釋放
特殊情況 對(duì)于 [NSString stringWithFormat:]創(chuàng)建的對(duì)象生命周期會(huì)延長(zhǎng)困鸥。
并且類(lèi)似用工廠(chǎng)方法初始化的生命周期都會(huì)延長(zhǎng)嗅蔬。
參考:https://suhou.github.io/2017/03/01/由NSString什么時(shí)候釋放說(shuō)起/