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需要實現協議。