點贊再看,養(yǎng)成習(xí)慣,
歡迎大家關(guān)注我面試小專欄 : iOS中高級進階之路 有我準備的一線大廠面試資料和簡歷模板,歡迎Star妄均!
copy就是內(nèi)容copy壤巷,比如NSString寄症,copy就是新生成了一個對象您访;但是如果是NSArray,NSDictionary等,copy的是其對象的指針,并沒有copy里面的內(nèi)容,這種也叫做淺拷貝偏化。深拷貝是神馬呢?簡單镐侯,就是把里面的內(nèi)容也給拷貝了侦讨。
以下copy和mutableCopy僅僅指Objective-C中的copy和mutableCopy。上段話本人混淆了C++中的copy和OC中的copy苟翻。
mutableCopy就是拷貝一個mutable對象。(我也不知道我在說什么)
那么上面的理解全面嗎崇猫?讓我們從最簡單的字符串(非容器類)來做試驗吧:
前提:在iOS中并不是所有的對象都支持copy沈条,mutableCopy,遵守NSCopying 協(xié)議的類可以發(fā)送copy消息邓尤,遵守NSMutableCopying 協(xié)議的類才可以發(fā)送mutableCopy消息拍鲤。假如發(fā)送了一個沒有遵守上訴兩協(xié)議而發(fā)送 copy或者 mutableCopy,那么就會發(fā)生異常。但是默認的iOS類并沒有遵守這兩個協(xié)議汞扎。如果想自定義一下copy 那么就必須遵守NSCopying,并且實現(xiàn) copyWithZone: 方法季稳,如果想自定義一下mutableCopy 那么就必須遵守NSMutableCopying,并且實現(xiàn) mutableCopyWithZone: 方法。
自然是可以發(fā)送copy和mutableCopy消息的澈魄。
首先身為理工女我要做個數(shù)學(xué)題景鼠,NSMutableString NSString和 copy mutableCopy,在“=”左右有幾種組合呢,
代碼如下:
大家發(fā)現(xiàn)神馬了:test1和test2是一個地址铛漓,也就是說copy并沒有創(chuàng)建出來一個新字符串對象溯香;
1和3不同,說明mutableCopy創(chuàng)建出一個新字符串對象浓恶;
1和4相同玫坛,說明沒有生成新對象;
1和5不同包晰,說明生成了新對象湿镀;
綜上所述,在字符串是直接賦值的伐憾,是否生成新對象是和=右邊有關(guān)的勉痴,如果=右邊是mutableCopy才會生成新對象。
讓我們試試別的字符串生成方式树肃,比如:
好吧蒸矛,結(jié)果同上。
還有另外一種生成方式胸嘴,如下:
只要=右邊從創(chuàng)建到賦值雏掠,至少包含一個NSMutable便會重新生成一個對象(新增:就是帶有mutable就是深copy,所以后三個便是深copy)筛谚。如果對一不可變對象復(fù)制磁玉,copy是指針復(fù)制(淺拷貝)和mutableCopy就是對象復(fù)制(深拷貝)。但是copy返回的對象是不可變的驾讲。
**新增:
簡單說明就是
[inmutableObj copy] 淺copy
[inmutableObj mutableCopy]深copy
[mutableObj copy] 深copy
[mutableObj mutableCopy] 深copy 新對象地址有變,我們就認為是深copy席赂。
**
容器類的copy mutableCopy
容器類本身的copy mutableCopy和非容器類的一樣吮铭,需要研究的是容器內(nèi)對象的變化
新增:上面一句話的意思,增加詳細解釋颅停。
從上圖可知谓晌,
[inmutableObj copy]淺拷貝
[inmutableObj mutableCopy]深拷貝 但是從輸出地址可以看出,僅僅該對象地址有變化癞揉,內(nèi)部對象是沒有變化的纸肉。
[mutableObj copy]深拷貝
[mutableObj mutableCopy]深拷貝
綜上所述,和字符串的結(jié)論是一樣的喊熟,不過集合類的內(nèi)部元素如果想實現(xiàn)真正的深拷貝柏肪,需要依次進行深拷貝才行
新增結(jié)束
自定義對象的copy和mutableCopy
首先必須遵守NSCopying,NSMutableCopying協(xié)議芥牌,不然當(dāng)WFPerson對象執(zhí)行copy和mutableCopy時會崩潰烦味!
根據(jù)copy其實調(diào)用的函數(shù)是copyWithZone;mutableCopy調(diào)用的函數(shù)是mutableCopyWithZone壁拉。我們可以猜測WFPerson當(dāng)其對象執(zhí)行copy mutableCopy是生成新對象谬俄。柏靶。。為什么呢溃论?因為我們自己寫的就是創(chuàng)建一個新對象屎蜓,_。
新增:在自定義對象中钥勋,如果想在copy時梆靖,還是原對象,return self笔诵;即可返吻。
自定義對象中,注意到頭文件中
name屬性是copy乎婿,那么這里的copy和函數(shù)的copy之間的關(guān)系呢测僵?
情況1,直接給name賦值
代碼說明我們這里的copy是重新生成了字符串谢翎,根據(jù)上面字符串的判斷捍靠,s本身就是可變字符串,其copy必是新生成了一個字符串對象森逮。
驗證name是strong榨婆,推測會變?yōu)樾娦〖t,經(jīng)驗證的確如此褒侧,我就不粘圖了良风。。
如果這里有人想自己實現(xiàn)setName函數(shù)呢闷供,
如果是這樣寫烟央,就變回strong,也就是小強小紅了歪脏,不信你試試疑俭。。
這樣就是copy了婿失。出來的還是小強钞艇。那mutableCopy呢?還是小強豪硅。
發(fā)現(xiàn)兩個數(shù)組中的person的年齡都變化了哩照,說明內(nèi)部數(shù)據(jù)依然指向相同的內(nèi)容。
答案是
不能舟误。葡秒。。
說明copy出來的是不可變對象,copyArray不能執(zhí)行removeObject眯牧。蹋岩。。
更新支持文章持續(xù)更新学少!
歡迎大家關(guān)注我面試小專欄 : iOS中高級進階之路 有我準備的一線大廠面試資料和簡歷模板剪个,歡迎Star!