在進(jìn)行iOS開發(fā)時候,深拷貝很多人不經(jīng)常用,但是有時候出了bug,追查很久,才發(fā)現(xiàn)是深淺拷貝的問題,往往浪費很多時間。
場景:
假設(shè)在即時通訊發(fā)消息,下載東西時候,對文件進(jìn)行model定義后,多層傳參。在某一層方法的時候,這個model改變了里面的值比如isDownload=YES;然后最外層方法還需要isDownload原來的狀態(tài),沒有理解深淺拷貝就會犯錯。
深拷貝同淺拷貝的區(qū)別:
淺拷貝是指針拷貝,對一個對象進(jìn)行淺拷貝,相當(dāng)于對指向?qū)ο蟮闹羔樳M(jìn)行復(fù)制,產(chǎn)生一個新的指向這個對象的指針,那么就是有兩個指針指向同一個對象,這個對象銷毀后兩個指針都應(yīng)該置空。深拷貝是對一個對象進(jìn)行拷貝,相當(dāng)于對對象進(jìn)行復(fù)制,產(chǎn)生一個新的對象,那么就有兩個指針分別 指向兩個對象。當(dāng)一個對象改變或者被銷毀后拷貝出來的新的對象不受影響。
實現(xiàn)深拷貝,需要實現(xiàn)NSCoying協(xié)議,實現(xiàn)- (id)copyWithZone:(NSZone *)zone方法。如果父類實現(xiàn)了這個方法,子類重寫時候不要忘記調(diào)用父類方法,再加上自己邏輯。父類沒有實現(xiàn)的話,子類實現(xiàn)的時候要對父類也進(jìn)行處理一下。