1. copy與retain的區別:安全
1.1 copy是建立一個新對象,retain是建立一個指針,引用對象計數加1.Copy屬性表示兩個對象內容相同,新的對象retain爲1,與舊有對象的引用計數無關,舊有對象沒有變化,copy減小對象對上下文的依賴.函數
1.2 retain屬性表示兩個對象地址相同(創建一個指針,指針拷貝),內容固然相同,這個對象的retain值+1也就是說,retain 是指針拷貝,copy 是內容拷貝.指針
// ...........................................................................................對象
2.字符串爲何要用Copy?內存
2.1 概念rem
假若有一個NSMutableString,如今用他給一個retain修飾的NSString賦值,那麼只是將NSString指向了NSMutableString所指向的位置,並對NSMUtbaleString計數器加一,此時,若是對NSMutableString進行修改,也會致使NSString的值修改,原則上這是不容許的. 若是是copy修飾的NSString對象,在用NSMutableString給他賦值時,會進行深拷貝,及把內容也給拷貝了一份,二者指向不一樣的位置,即便改變了NSMutableString的值,NSString的值也不會改變.因此用copy是爲了安全,防止NSMutableString賦值給NSString時,前者修改引發後者值變化而用的.字符串
2.2 提示 : 謹記Copy屬性的setter方法的結構.內存管理
2.3 : 簡述,當給一個對象賦新值時,會把新值拷貝一個副本出來賦值給對象,這樣新值跟舊值就沒有任何關係.table
// ...........................................................................................容器
3.淺拷貝和深拷貝.
3.1 概念
深拷貝 : 內容拷貝,源對象和副本對象指的是兩個不一樣的對象,源對象引用計數器不變,副本對象引用計數器爲1.
淺拷貝 : 指針拷貝,源對象和副本對象指的都是同一個對象,對象引用計數器+1,至關於retain.
提示 : 只有不可變對象建立不可變副本(copy)纔是淺拷貝,其它的都是深拷貝.
3.2 若是對不可變對象拷貝,copy是指針拷貝(淺拷貝);可是,mutableCopy就是對象拷貝(深拷貝).
3.3 若是是對可變對象拷貝,copy都是深拷貝;可是,copy返回的對象是不可變的.
// ...........................................................................................
4.自定義對象的拷貝
4.1 自定義對象若是要淺拷貝就遵照<NSCopying>協議 (copy)
4.2 自定義對象若是要深拷貝就遵照<NSMutableCopying>協議 (mutableCopy)
4.3 自定義對象遵照了相關協議,就可以調用相應的深拷貝或者淺拷貝的方法
// ...........................................................................................
5.Block定義成屬性爲何用Copy?
5.1 MRC : Block的本質是函數指針,內存地址在棧區,使用Copy是爲了把Block由棧區拷貝到堆區,共享給當前對象使用.
5.2 ARC : Block定義成屬性時,使用strong和copy的效果是同樣,可是蘋果官方建議使用copy.
// ...........................................................................................
6.容器的內存管理
5.1
[tmpM addObject:obj];
這樣obj的引用計數會增長1.tmpM對obj強引用.
5.2
[tmpM removeObjectAtIndex:0];
obj的引用計數會減1.tmpM再也不對obj有引用.