1> copy的使用場(chǎng)景
當(dāng)多個(gè)指針指向同一個(gè)對(duì)象時(shí),為避免一個(gè)指針對(duì)對(duì)象的改動(dòng)對(duì)其他指針的使用產(chǎn)生影響,使用copy來(lái)創(chuàng)建對(duì)象的副本
如頁(yè)面間傳值使用copy,A向B控制器傳屬性(屬性為自定義對(duì)象),為避免因A的屬性變化對(duì)B的屬性產(chǎn)生影響
再如多人開(kāi)發(fā)或封裝庫(kù),在不明確傳入值為可變還是不可變的情況下,使用copy更安全
2> 什么是深拷貝淺拷貝
對(duì)于非容器類(lèi)對(duì)象,不可變對(duì)象進(jìn)行copy操作為淺拷貝,引用計(jì)數(shù)器加1,其他三種為深拷貝
對(duì)于容器類(lèi)對(duì)象,基本和非容器類(lèi)對(duì)象一致,但注意其深拷貝是對(duì)象本身是對(duì)象復(fù)制,其中元素仍為指針復(fù)制,系統(tǒng)將initWithArray方法歸為了元素深拷貝,但其實(shí)如果元素為不可變?cè)?仍為指針復(fù)制,使用歸解檔可以實(shí)現(xiàn)真正的深拷貝,元素也是對(duì)象拷貝NSArray* trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:
[NSKeyedArchiver archivedDataWithRootObject: array]];
3> 字符串什么時(shí)候使用copy,strong
屬性引用的對(duì)象由兩種情況,可變和不可變字符串
引用對(duì)象不可變情況下,copy和strong一樣,copy為淺拷貝
引用對(duì)象可變情況下,如果希望屬性跟隨引用對(duì)象變化,使用strong,希望不跟隨變化使用copy
4> 字符串所在內(nèi)存區(qū)域
@“abc” 常量區(qū) stringwithformat 堆區(qū)
*5> mutablecopy和copy @property(copy) NSMutableArray arr;這樣寫(xiě)有什么問(wèn)題
mutablecopy返回可變對(duì)象,copy返回不可變對(duì)象
6> 如何讓自定義類(lèi)可以使用copy修飾符
實(shí)現(xiàn)<NSCopying>協(xié)議,重寫(xiě)copyWithZone方法