1. 程式人生 > >OC copy記憶體管理語義及 copy mutableCopy

OC copy記憶體管理語義及 copy mutableCopy

1.copy記憶體管理語義

A:copy 相對 strong對屬性(string array dictionarry)的修飾,區別在於如果傳過來的是一個mutable,strong修飾的指標內容會受到外部修改而影響,而內部預設無感知;copy則會重新alloc拷貝一份,而對於傳過來的是inmutable的處理方式一致,都是增減引用計數。

B:定義block的時候,其定義的記憶體是分配在棧中的,其在定義block的範圍內有效,當物件存在block屬性一般用copy記憶體管理語義,拷貝到堆區,也就相當於存在引用計數概念了,後續的複製只會增加引用計數。


備註:

(1)

[NSString copy]               指標複製,返回的物件的地址和方法的接收者一樣,引用計數加1


[NSMutableString copy]        深複製,重新Alloc一個 NSString 的物件,並返回。返回物件的地址和方法接收者的地址不一樣,並且方法接受者的內容改變不影響返回物件,同時返回物件的內容不可以改變。

(2)

[NSString mutableCopy]        深複製,重新Alloc一個NSMuatbleString,並返回。返回物件的地址和方法接收者的地址不一樣,2者的內容改變不影響另一者,同時返回物件的內容可以改變。
[NSMutableString mutableCopy]  深複製,重新Alloc一個NSMuatbleString,並返回。返回物件的地址和方法接收者的地址不一樣,2者的內容改變不影響另一者,同時返回物件的內容可以改變。

(3)

對於陣列、集合等容器講雖然做了深複製,但是內部元素地址還是淺拷貝,比如一個人的朋友圈集合的複製,所以要實現深拷貝就要物件去實現NSCopying協議,或者提供一個 deepCopy方法。


物件呼叫了copy方法,而copy方法最終會要求呼叫類方法copyWithZone:, 而NSObject本身並沒有實現這個類方法, 這個方法是放在NSCopying協議中的,自定義物件呼叫copy需要實現協議。