????在iOS的王國里忍宋,Strong、Copy和mutableCopy在我們的使用過程中风罩,缺一不可的糠排。接下來來介紹一下它們之間的關(guān)系和注意點(diǎn)。
一超升、Copy和mutableCopy之拷貝
????在生活中入宦,時常會用到一個詞“拷貝”哺徊。例如:微信群里、朋友圈很多人會分享同一篇的文章或者是活動內(nèi)容乾闰,這是一種“拷貝”落追。這就是類似于淺拷貝“Copy”。當(dāng)你一個好朋友對你說涯肩,把你那個項(xiàng)目給我拷一份轿钠,這就是類似于深拷貝”mutableCopy“。
淺拷貝(Copy):指針拷貝病苗,不產(chǎn)生新的對象疗垛,源對象的引用計(jì)數(shù)器+1;
深拷貝(mutableCopy):對象的拷貝硫朦,會產(chǎn)生新的對象贷腕,源對象的引用計(jì)數(shù)器不變。
判斷是淺拷貝和深拷貝就看兩個變量的內(nèi)存地址是否一樣咬展,一樣就是淺拷貝泽裳,不一樣就是深拷貝,也可以改變一個變量的其中一個屬性值看兩者的值是否發(fā)生變化挚赊。
系統(tǒng)原生的對象深淺拷貝區(qū)別
? ? NSObject類提供Copy和mutableCopy方法诡壁,通過這兩個方法即可拷貝已有對象的副本,主要的系統(tǒng)原生對象有:NSString和NSMutableString荠割、NSArray和NSMutableArray妹卿、NSDictionary和NSMutableDictionary、NSSet和NSMutableSet蔑鹦,NSValue和NSNumber只遵守的NSCoping協(xié)議夺克。
注意:基本數(shù)據(jù)類型(assign修飾),沒有對應(yīng)的指針(假象)嚎朽,直接賦值操作铺纽,無需copy操作。
二哟忍、Copy和Strong區(qū)別
? ? 在OC中經(jīng)常會碰到定義一個屬性property狡门,使用copy、strong這兩個詞锅很。
? ? 在系統(tǒng)原生對象中:NSString和NSMutableString其馏、NSArray和NSMutableArray、NSDictionary和NSMutableDictionary爆安、NSSet和NSMutableSet的使用這兩個詞的區(qū)別叛复。NSString、NSArray、NSDictionary褐奥、NSSet都使用Copy這個修飾詞咖耘,而NSMutableString、NSMutableArray撬码、NSMutableDictionary和NSMutableSet則使用Strong修飾儿倒。
@property 中的copy 參數(shù)的作用:
在屬性的setter實(shí)現(xiàn)中對賦值對象做一次copy操作,將copy操作的結(jié)果賦值給屬性呜笑。
情況一:屬性是不可變類型的:如:NSString义桂、NSArray、NSDictionary蹈垢、NSSet
????如果賦值對象是可變的慷吊,那么將一個不可變的副本賦值給屬性。
????如果賦值對象是不可變的曹抬,那么不會產(chǎn)生新的副本溉瓶,只是對復(fù)制對象引用計(jì)數(shù)器加1。
情況二:屬性是可變類型的谤民,建議不要使用copy參數(shù)
? ? 可變類型的屬性會根據(jù)需求對其內(nèi)容進(jìn)行修改堰酿,使用copy屬性的對象類型是不可變的。如果修改這個屬性张足,編譯是不會報錯触创,但是運(yùn)行會奔潰。因?yàn)閲L試修改一個不可變的對象为牍。
情況三:自定義對象類型哼绑,一般情況下不會對自定義的對象使用copy參數(shù)。
? ? 必須遵守<NSCopying>協(xié)議碉咆,實(shí)現(xiàn)CopyWithZone:方法抖韩,才能調(diào)用Copy方法,創(chuàng)建副本疫铜。
總之:Strong茂浮、Copy 和 mutableCopy這三者之間,需要從底層考慮壳咕。OC是一個動態(tài)的面向?qū)ο笳Z言席揽,C語言是OC的底層實(shí)現(xiàn)。Strong主要是對一個堆對象添加一個引用點(diǎn)谓厘,Copy和MutableCopy主要是從拷貝內(nèi)容著手幌羞,是否創(chuàng)建新的內(nèi)容空間。