什么是copy?
copy從字面意思來看就是“復(fù)制”延欠、“拷貝”,是一個(gè)產(chǎn)生副本的過程阐斜。
而在OC中衫冻,copy是用來復(fù)制對(duì)象的,也就是一個(gè)利用一個(gè)源對(duì)象來產(chǎn)生一個(gè)新對(duì)象的過程谒出。而復(fù)制過后隅俘,源對(duì)象和副本對(duì)象有如下特征:
修改源對(duì)象的屬性和行為邻奠,不會(huì)影響副本對(duì)象。
修改副本對(duì)象的屬性和行為为居,不會(huì)影響源對(duì)象碌宴。
如何使用copy?
在OC中蒙畴,copy分為- (id)copy
和- (id)mutableCopy
,兩者都可以用來創(chuàng)建一個(gè)副本對(duì)象贰镣。copy產(chǎn)生的是一個(gè)不可變副本(如NSArray,NSDictionary膳凝,NSString)碑隆,mutableCopy產(chǎn)生的是一個(gè)可變副本(如NSMutableArray,NSMutableDictionary蹬音,NSMutableString)上煤。
copy的使用前提
使用copy方法,需要遵守NSCoyping協(xié)議著淆,實(shí)現(xiàn)copyWithZone:方法劫狠。
使用mutableCopy方法,則需要遵守NSMutableCopying協(xié)議永部,實(shí)現(xiàn)mutableCopyWithZone:方法独泞。
閱讀官方文檔可知,這兩種方法苔埋,是通過調(diào)用協(xié)議里的copyWithZone:和mutableCopyWithZone:來實(shí)現(xiàn)復(fù)制的懦砂。
Declaration
(id)copy;
Return Value
The object returned by the NSCopying protocol method copyWithZone:,.
Declaration
(id)mutableCopy;
Return Value
The object returned by the NSMutableCopying protocol method mutableCopyWithZone:, where the zone is nil.
深復(fù)制和淺復(fù)制
深復(fù)制
深復(fù)制也被稱作“深拷貝”、“內(nèi)容拷貝”组橄、“deep copy”孕惜。
淺復(fù)制
淺復(fù)制也被稱為“淺拷貝”、“指針拷貝”晨炕、“shallow copy”。
如何判斷一個(gè)復(fù)制是深復(fù)制還是淺復(fù)制毫炉?
其實(shí)判斷一個(gè)復(fù)制是深復(fù)制還是淺復(fù)制很簡單瓮栗,對(duì)于一個(gè)復(fù)制過程來說,只有當(dāng)源對(duì)象和副本對(duì)象都是不可變時(shí)瞄勾,它才是淺復(fù)制费奸,否則都為深復(fù)制。
下圖為常見的復(fù)制:
深復(fù)制和淺復(fù)制的區(qū)別
深復(fù)制
源對(duì)象和副本對(duì)象是兩個(gè)不同的對(duì)象
源對(duì)象引用計(jì)數(shù)器不變进陡,副本對(duì)象計(jì)數(shù)器為1(因?yàn)槭切庐a(chǎn)生的)
本質(zhì):產(chǎn)生了新對(duì)象-
淺復(fù)制
源對(duì)象和副本對(duì)象是同一個(gè)對(duì)象源對(duì)象引用計(jì)數(shù)器+1愿阐,相當(dāng)于做了一個(gè)retain操作 本質(zhì):沒有產(chǎn)生新對(duì)象
copy和@property
- 用于NSString和block。