深淺copy
淺拷貝:指針拷貝,復制一個新的指針,指向同一塊內存區域。實際內存并沒有發生拷貝
深拷貝:內容拷貝,拷貝數據到一塊新內存區域,指針指向拷貝的數據區
淺復制很簡單,只是簡單的指針拷貝,所以改變原對象或者拷貝后的對象,都會影響另外一個對象。
為什么NSString的屬性關鍵字一定要用copy呢?我用Strong不行嗎?
strong會有一個問題,如果我用一個mutablestring賦值給這個strong屬性,然后我修改這個mutablestring,你這個strong屬性就會被修改,就不安全了,是不期望的結果。copy就沒有這個問題。
@property(nonatomic,strong)NSString *tempStr;
NSMutableString *str = [[NSMutableString alloc]initWithString:@"1111"];
self.tempStr = str;
[str appendString:@"11123"];
NSLog(@"%@",self.tempStr);
輸出111111123
copy: 對于可變對象為深拷貝,對于不可變對象為淺拷貝
mutableCopy:始終是深拷貝
在OC中不是所有的類都支持拷貝,只有遵循<NSCopying>才支持copy,只有遵循<NSMutableCopying>才支持mutableCopy。如果沒有遵循,拷貝時會直接Crash。
如果是自定義類對象 需要遵循<NSCoding>否則在使用NSKeyedArchiver的時候會Crash。(完全拷貝NSKeyedUnarchiver)
?1、retain是對當前對象增加了一個指針指向,使對象的引用計數器加1, 是進行了一次安全的淺拷貝操作。
?2、copy是對當前對象進行了一次拷貝,重新拷貝了當前對象,當使用的時候減少了對當前對象的依賴。
淺拷貝:只是復制容器本身,不會復制容器內部的元素,淺拷貝后生成的新容器對象和原始容器對象共享內部元素
深拷貝:不僅復制容器本身,容器內部的元素也會復制,深拷貝后生成的新容器對象和原始容器的內部元素是獨立的。
copy:不可變拷貝,遵循NSCopying協議,需要對應實現copyWithZone方法
mutableCopy:可變拷貝,遵循NSMutableCopying協議,需要對應實現mutableCopyWithZone:方法