曾同學(xué)寫在前頭 --> 碼字不易,覺得有用寫得不錯的請點贊.覺得哪里有疑惑,請留下你的評論,咱們好好聊聊,多交流,技術(shù)更進(jìn)一步喲~~~
關(guān)于strong & copy的區(qū)別:
通常問到該問題的,基本都是面試的時候遇到,自己本身開發(fā)或許不會考慮太多,但是對于一個有追求有理想的工程師,我們要好好理解它兩的不同.
究兩者之本質(zhì):不同的修飾符就是調(diào)用了不同的方法砌溺,其實就是set方法的不同
strong:指向_property地址.
setter方法-->[_property release]
-->[_property retain]
--> _property = property
copy:新建一個內(nèi)存空間伙判,用于存儲_property的值.
setter方法-->[_property release]
-->[property copy]
-new一個內(nèi)存地址->_property = property
翠花~ 上Code~~:
@property(strong, nonatomic) NSArray *strongArray;
@property(copy, nonatomic) NSArray *acopyArray;
NSMutableArray *array = [@[@"array_1"] mutableCopy];
self.strongArray = array;
self.acopyArray = array;
[array addObject: @"array_2"];
NSLog(@"second: strong: %@, copy: %@", self.strongArray, self.acopyArray);
NSLog(@"print-->p: strong: %p, copy: %p, array: %p", self.strongArray, self.acopyArray, array);
以上便是結(jié)合代碼,通過結(jié)論去理解兩者的不同(本人在早期學(xué)習(xí)時, 在網(wǎng)絡(luò)上的引用)
把它們抽象成一張圖,大家看了大概就明白了(臨時作圖, 下次搞個好點的工具)
圖片說明: 使用 strong 時(左),新建一個對象并賦值時, obj_跟 obj_cp 指針地址不同,但他們都指向同一塊堆空間存放的 Obj,當(dāng)其中一個對象修改Obj 的值時,另外一個對象再調(diào)用時,值就已經(jīng)改變了. 使用 copy 時(右),同樣新建對象該屬性賦值時,兩個屬性的堆椂胀洌空間都已經(jīng)獨立了,相互間不影響,也就能保證數(shù)據(jù)安全咯.
小結(jié):
strong在棧中的指針指向的是同一塊內(nèi)存地址顶霞,當(dāng)對應(yīng)的堆中的對象發(fā)生變化時匆笤,意味著該屬性的值也隨之變化扭吁;
copy在賦值之前让腹,會創(chuàng)建一塊新的椛娜簦空間存儲內(nèi)存地址盒音,指向新的堆空間地址表鳍,并把值存儲到該地址指向的控件中。
以上, 為二者區(qū)別. 了解區(qū)別有啥用?肯定得跟實踐應(yīng)用結(jié)合起來嘛, 所以以下為開發(fā)提供的一些建議.
當(dāng)修飾 NSString/NSArray 等對象時祥诽,最好使用copy修飾譬圣。當(dāng)然,具體還需要視項目需求來決定,建議使用 copy, 因為現(xiàn)在這點內(nèi)存消耗,咱們還是耗得起的.