引言
在對于自定義的對象支持copy功能鞍历,也就是我們要給自定義的對象發(fā)送copy message,那我們就要手動實現(xiàn)NSCopying協(xié)議秸滴。在項目開發(fā)中我們?nèi)绻麑δ硞€字典或者數(shù)組對象進行了一次mutbleCopy其實系統(tǒng)默認的調(diào)用了如下API:
- (id)mutableCopyWithZone:(nullable NSZone *)zone;
淺拷貝
如果你現(xiàn)在通過retain或者alloc創(chuàng)建并持有了一個對象,淺拷貝就是重新拷貝了一個指向當前這個對象的指針尘颓,此時就有兩份指針同時指向當前對象的內(nèi)存區(qū)域,即指向同一塊內(nèi)存區(qū)域,對象只有一份并沒有發(fā)生任何變化虏辫。
NSString *hdfString = @"haodf.com";
NSString *str = hdfString;
NSString *str2 = [str copy];
深拷貝
深拷貝拷貝當前指針指向的對象,系統(tǒng)會隨機給拷貝的對象重新分配一塊內(nèi)存锈拨,?深拷貝以后砌庄,兩份對象的內(nèi)存地址不一樣,指針指向也不一樣奕枢。深拷貝會把當前容器中的對象重新拷貝一份放到另一個容器中娄昆,拷貝后的指針指向新的容器。
NSString *hdfString = @"haodf.com";
NSString *str = [hdfString copy];
NSString *str2 = [str mutableCopy];
小結(jié)
1缝彬、對不可變的對象進行mutableCopy操作,是進行了一次深拷貝萌焰,返回的對象是可變的對象。
2谷浅、對不可變的對象進行copy操作扒俯,進行了一次淺拷貝族购,返回一個不可變的對象。
3陵珍、對可變得對象進行copy寝杖,進行了深拷貝,產(chǎn)生了不可變的對象副本互纯。
4瑟幕、 對可變的對象進行了一次mutableCopy,是進行了一次深拷貝留潦, 返回的對象是一個可變的對象只盹。
5、想要讓自定義的對象支持copy和mutableCopy那么就要對應(yīng)實現(xiàn)NSCopying協(xié)議兔院,和NSMutableCopying協(xié)議殖卑。
retain和copy的區(qū)別:
1、retain是對當前對象增加了一個指針指向坊萝,使對象的引用計數(shù)器加1孵稽, 是進行了一次安全的淺拷貝操作。
2十偶、copy是對當前對象進行了一次拷貝菩鲜,重新拷貝了當前對象,當使用的時候減少了對當前對象的依賴惦积。