由來(lái):最近看了好多比較著名開(kāi)源框架,突然發(fā)現(xiàn)了一個(gè)問(wèn)題腥光,就是大多數(shù)著名的框架對(duì)于? NSString, NSArray,NSDictionary。屬性修飾符用的copy伍纫。而樓主對(duì)于這一塊喜歡用strong泌神,或者retain债热。于是樓主這里產(chǎn)生了這么一個(gè)問(wèn)題焕刮?
為什么這些框架里面不采用strong高镐,或者retain观腊。樓主對(duì)于這一塊查了很多資料,同時(shí)也方便自己對(duì)于這塊的使用。
這里就涉及到了深復(fù)制和淺復(fù)制骗村,相信大家在面試的時(shí)候都被問(wèn)過(guò)了什么是深復(fù)制琅拌,什么是淺復(fù)制,深復(fù)制和淺復(fù)制有什么區(qū)別。
copy在這里就是淺復(fù)制隶校,又名:指針復(fù)制舞终。mutableCopy是深復(fù)制余爆,又名對(duì)象復(fù)制上陕。并且如果是對(duì)可變對(duì)象進(jìn)行復(fù)制都是深復(fù)制亚隅。由此copy只用來(lái)修飾不可變對(duì)象比如:NSString,NSArray,NSDictionary渐尿。另外block也是用copy修飾砖茸。
肯定也有人不知道什么是深復(fù)制和淺復(fù)制采幌,我這邊還是給大家解釋一下:
淺復(fù)制:只復(fù)制指針值而不是實(shí)際資源人柿。
深復(fù)制:深復(fù)制是指不僅復(fù)制指針哥放,還復(fù)制指針?biāo)赶虻馁Y源犀农。也就是新產(chǎn)生了一個(gè)對(duì)象拒炎。
深復(fù)制和淺復(fù)制都有復(fù)制2個(gè)字丁侄,復(fù)制的意義何在,就是改變?cè)瓉?lái)的內(nèi)容,不影響復(fù)制的內(nèi)容。改復(fù)制的內(nèi)容损拢,不影響原來(lái)的內(nèi)容蒙幻。
而對(duì)于為什么使用是為了防止別人修改外界的屬性抒和,而不影響最原始的屬性。
大家肯定又要問(wèn)道為什么block要使用copy?
大家肯定知道最開(kāi)始的時(shí)候是沒(méi)有ARC(內(nèi)存自動(dòng)管理)的撕阎,都是MRC(手動(dòng)內(nèi)存管理)。block最開(kāi)始是基于MRC的情況下的,是為了防止block用過(guò)的變量提前釋放了,導(dǎo)致程序over了只恨。我們這邊就會(huì)使用copy咱圆,將bolck放到堆中。但是如果將block放到堆中就會(huì)產(chǎn)生一個(gè)新問(wèn)題。也就是將block內(nèi)部持有對(duì)象的時(shí)候佛点,百分百會(huì)產(chǎn)生循環(huán)引用,從而導(dǎo)致內(nèi)存泄露米碰。我以前的文章針對(duì)這個(gè)現(xiàn)象就有提到菱蔬,同時(shí)這里也會(huì)附上正確的解決方法:《針對(duì)內(nèi)存泄露-開(kāi)發(fā)容易被忽略的例子-by:西瓜》。
就此結(jié)束蚪腐。