開發(fā)中有這么一種情況,詳情頁面 detailsVc 持有 model, 需要將model傳給編輯頁面 editVc ,然后在編輯頁面修改

銀海ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
如果直接使用
會(huì)出現(xiàn)這么一種情況: 在 editVc 中修改,不管是否保存,返回?detailsVc 頁面,數(shù)據(jù)都會(huì)有變化,因?yàn)?model 在 editVc 中被修改了!
原因,看指針地址
因?yàn)槲?model 寫了懶加載,開始有個(gè)內(nèi)存地址,但是賦值之后,內(nèi)存地址變成了賦值model的內(nèi)存地址, 也就是傳遞的時(shí)候,只是 detailsVc 將持有的 model 的指針,傳給了?editVc 的model,并不是新建了一個(gè)值!?editVc 修改model 修改的是指針指向的區(qū)域的值,導(dǎo)致了detailsVc 的 model? 隨著變化,避免這種情況,就需要用到copy.
但是直接這樣寫,會(huì)崩潰! 因?yàn)檎{(diào)用 copy 方法時(shí),對(duì)象會(huì)調(diào)用?copyWithZone: 方法來實(shí)現(xiàn)賦值!
解決辦法: 讓對(duì)象實(shí)現(xiàn)?NSCopying 協(xié)議
當(dāng)然,屬性太多,這樣寫也夠累的,可以利用 runtime 完成
ps: ?這里 不能 return self ! copy 我們只是新建了一個(gè)來一個(gè)個(gè)賦值上去, return self 的話,就是把原本的返回,而不是 copy 出來的新對(duì)象!
在開發(fā)的過程中,我們有時(shí)候想要在A應(yīng)用中復(fù)制一段文本,然后在B應(yīng)用中粘貼使用,這就需要使用到系統(tǒng)級(jí)的復(fù)制粘貼功能了。在iOS中,實(shí)現(xiàn)全系統(tǒng)復(fù)制功能的代碼其實(shí)很簡(jiǎn)單:
UIPasteboard *pb = [UIPasteboard generalPasteboard];
pb.string = @"hello,world!";
接下來我們看一下效果:
在這里我就先寫這么多,接下來我會(huì)把 UIPasteboard 類的詳細(xì)使用示例總結(jié)一下
相信對(duì)于有一定iOS開發(fā)經(jīng)驗(yàn)的同學(xué)來說,對(duì)于copy關(guān)鍵字一定不陌生,從字義上來看,應(yīng)該就是復(fù)制一個(gè)對(duì)象,然后我們對(duì)于NSString類型的屬性,一般也用copy關(guān)鍵字。但是大家對(duì)于copy關(guān)鍵字真正有什么具體了解呢,什么時(shí)候用copy,什么時(shí)候用mutableCopy,區(qū)別又在哪里,對(duì)于內(nèi)存存儲(chǔ)上又有什么知識(shí)點(diǎn),我相信還有一部分同學(xué)一知半解。秉著鉆研探索的精神,我們來詳細(xì)的學(xué)習(xí)一下。
首先我們先說兩個(gè)兩個(gè)概念:
淺復(fù)制:不拷貝對(duì)象本身,僅僅是拷貝指向?qū)ο蟮闹羔?/p>
深復(fù)制:是直接拷貝整個(gè)對(duì)象內(nèi)存到另一塊內(nèi)存中
[圖片上傳失敗...(image-e2ec57-1528108363467)]
一般來說像這種使用‘=’號(hào)賦值的對(duì)象,基本上都是淺復(fù)制
[圖片上傳失敗...(image-a66b63-1528108363467)]
內(nèi)存地址一樣的,很簡(jiǎn)單,所以它也是我們說的淺復(fù)制之一。
然后我們來來看copy這關(guān)鍵字;
copy的字面意思就是“復(fù)制”,它是產(chǎn)生一個(gè)副本的過程,再來看在iOS里,copy與mutableCopy都是NSObject里的方法,一個(gè)NSObject的對(duì)象要想使用這兩個(gè)函數(shù),那么類必須實(shí)現(xiàn)NSCopying協(xié)議或NSMutableCopying協(xié)議,并且是實(shí)現(xiàn)了一般來說我們用的很多系統(tǒng)里的容器類已經(jīng)實(shí)現(xiàn)了這些方法。
[圖片上傳失敗...(image-76a9d8-1528108363467)]
如果不遵守協(xié)議,直接使用[xxx copy],那么會(huì)直接導(dǎo)致程序崩潰,比如UIView這個(gè)類就不允許使用copy
然后我們?cè)賮砜碿opy關(guān)鍵字的特點(diǎn):
修改源對(duì)象的屬性和行為,不會(huì)影響副本對(duì)象
修改副本對(duì)象的屬性和行為,不會(huì)影響源對(duì)象
一個(gè)對(duì)象可以通過copy和mutableCopy方法來創(chuàng)建一個(gè)副本對(duì)象
copy:創(chuàng)建的是不可變副本(NSString,NSArray,NSDictionary)
mutableCopy:創(chuàng)建的是可變副本(NSMutableString,NSMutableArray,NSMutableDictionary)
原則就是:修改新(舊)對(duì)象,不影響舊(新)對(duì)象!而且不一定產(chǎn)生新的對(duì)象!(劃重點(diǎn))
看個(gè)例子:
打印
可以看到兩個(gè)對(duì)象的內(nèi)容完全一樣,但是地址空間變了,說明開辟了一塊新內(nèi)存供給副本,為什么這個(gè)會(huì)產(chǎn)生新的對(duì)象呢?
1.因?yàn)樵瓌t 修改新(舊)對(duì)象,不影響舊(新)對(duì)象,所以生成一個(gè)新的對(duì)象
2.因?yàn)橐郧暗膶?duì)象是個(gè)不可變對(duì)象,而通過mutableCopy拷貝出來的對(duì)象必須是一個(gè)可變的對(duì)象,所以必須生成一個(gè)新的對(duì)象
同理:
打印
文字內(nèi)容不同,對(duì)象地址不同,修改新(舊)對(duì)象,不影響舊(新)對(duì)象
相同的
打印
原理一樣,使用copy關(guān)鍵字,產(chǎn)生了一個(gè)新的不可變的對(duì)象
以上的例子我們可以發(fā)先,使用copy或者mutableCopy都有產(chǎn)生新對(duì)象,現(xiàn)在我們?cè)賮砜匆粋€(gè)例子
打印
這下我們發(fā)現(xiàn),兩個(gè)對(duì)象的內(nèi)存地址完全一樣,所以系統(tǒng)并沒有創(chuàng)建一個(gè)新對(duì)象,這是為什么呢?
當(dāng)我們對(duì)一個(gè)不可變對(duì)象(NSString類型)使用copy關(guān)鍵字的時(shí)候,系統(tǒng)是不會(huì)產(chǎn)生一個(gè)新對(duì)象,因?yàn)樵瓉淼膶?duì)象是不能修改的,拷貝出來的對(duì)象也是不能修改的,那么既然兩個(gè)都不可以修改,所以這兩個(gè)對(duì)象永遠(yuǎn)也不會(huì)影響到另一個(gè)對(duì)象(符合我們說的“修改新(舊)對(duì)象,不影響舊(新)對(duì)象”原則),系統(tǒng)為了節(jié)省內(nèi)存,所以就不會(huì)產(chǎn)生一個(gè)新的對(duì)象了。
那么問題來了, copy到底是深拷貝還是淺拷貝?
我相信有的同學(xué)認(rèn)為只要是使用copy關(guān)鍵字,那么肯定都是深拷貝,這樣是很不嚴(yán)謹(jǐn)?shù)模捅热缟蟼€(gè)例子,雖然使用了copy,但是指針地址是一樣,那么它就應(yīng)該是淺拷貝。
所以是否是深淺拷貝,是否創(chuàng)建新的對(duì)象,是由程序運(yùn)行的環(huán)境所造成的,并不是一概而論。
對(duì)于NSArray,NSDictionary,道理也是相同的。
現(xiàn)在再讓我們看下copy的內(nèi)存管理:
淺拷貝不會(huì)生成新的對(duì)象,所以系統(tǒng)會(huì)對(duì)以前的對(duì)象進(jìn)行一次retain,深拷貝會(huì)產(chǎn)生新的對(duì)象,系統(tǒng)不會(huì)對(duì)以前的對(duì)象進(jìn)行retain。
接著我們來看下copy與Block的配合使用
首先我們還是回顧一個(gè)概念
block默認(rèn)存儲(chǔ)在棧中,棧中的Block訪問到的外界對(duì)象,不會(huì)對(duì)應(yīng)進(jìn)行retain
block如果在堆中,在block中訪問了外界的對(duì)象,會(huì)對(duì)外界的對(duì)象進(jìn)行一次retian
因?yàn)閎lock在什么時(shí)候執(zhí)行是不確定的,所以如果block里外部對(duì)象被提前釋放了,那么如果這時(shí)候block執(zhí)行了,造成野指針異常,程序crash。
所以對(duì)于Block來說,我們一般都用copy關(guān)鍵字修飾.
使用copy保存block,這樣可以保住block中,避免以后調(diào)用block的時(shí)候,外界的對(duì)象已經(jīng)釋放了
網(wǎng)頁標(biāo)題:ios開發(fā)復(fù)制,ios強(qiáng)制復(fù)制
文章路徑:http://chinadenli.net/article33/dsggess.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、App開發(fā)、網(wǎng)站策劃、定制網(wǎng)站、、ChatGPT
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)