本文為大地瓜原創(chuàng)碳锈,歡迎知識共享,轉(zhuǎn)載請注明出處。
雖然你不注明出處我也沒什么精力和你計較。
作者微信號:christgreenlaw
字符串常見創(chuàng)建方式:
- 字符串常量創(chuàng)建
作為一個常量虏辫,它存儲在常量區(qū)蜒灰。其指針存在棧區(qū)淌铐,指針存儲的是常量區(qū)地址澜驮。
若創(chuàng)建多個內(nèi)容相同的常量字符串對象,則會指向同一塊存儲空間艺蝴。
NSString *str1 = @"sds";
NSString *str2 = @"sds";
str1和str2指向的是常量區(qū)的同一個位置猬腰。
- alloc init
alloc時就存儲在堆區(qū),會在堆區(qū)開辟地址存儲字符串猜敢。其指針在棧區(qū)姑荷,值為堆區(qū)的字符串地址。
由于alloc會開辟新的存儲空間缩擂,不論init時產(chǎn)生了什么內(nèi)容鼠冕,其地址都是不同的。也就是說撇叁,不管內(nèi)容,只要是allocinit方式生成的字符串畦贸,不會存儲在同一份空間中陨闹。
NSString *str1 = [[NSString alloc]initWithFormat:@"sds"];
NSString *str2 = [[NSString alloc]initWithFormat:@"sds"];
str1和str2指向的是堆區(qū)的不同位置。(平臺和編譯器都可能導致存儲方式不同薄坏,要看具體情況了)
//這段代碼在mac下運行的話趋厉,指向的將會是同一個位置,mac平臺做了優(yōu)化胶坠。
//在iOS平臺(Xcode6以下)下將會指向不同位置的君账。Xcode7以上iOS平臺就會使同一個位置。
//所以說還是要看具體情況了沈善。
字符串類工廠方式創(chuàng)建
內(nèi)部其實使用了alloc+init乡数。initWithString
一般來說椭蹄,通過alloc init會開辟新空間,但是alloc+initWithString除外净赴,此方法通過copy返回一個字符串對象绳矩。此處又涉及到深淺拷貝,深拷貝返回新對象玖翅,淺拷貝返回原有對象地址翼馆。此處是淺拷貝,所以是使用原來的對象的金度,會使用同一塊存儲空間应媚。