深拷貝
深拷貝:復制引用對象本身。內存中存在了兩份獨立對象本身晦墙,當修改A時孤钦,A_copy不變歧斟。
淺拷貝
淺拷貝:只復制指向對象的指針纯丸,而不復制引用對象本身。
系統(tǒng)對象的 copy 與 mutableCopy 方法
不管是集合類對象(NSArray静袖、NSDictionary觉鼻、NSSet ... 之類的對象),還是非集合類對象(NSString, NSNumber ... 之類的對象)队橙,接收到copy和mutableCopy消息時坠陈,都遵循以下準則:
- copy 返回的是不可變對象(immutableObject);如果用copy返回值調用mutable對象的方法就會crash捐康。
- mutableCopy 返回的是可變對象(mutableObject)仇矾。
一、非集合類對象的copy與mutableCopy
在非集合類對象中解总,對不可變對象進行copy操作贮匕,是指針復制,mutableCopy操作是內容復制花枫;
對可變對象進行copy和mutableCopy都是內容復制刻盐。用代碼簡單表示如下:
NSString *str = @"hello word!";
NSString *strCopy = [str copy] // 指針復制,strCopy與str的地址一樣
NSMutableString *strMCopy = [str mutableCopy] // 內容復制劳翰,strMCopy與str的地址不一樣
NSMutableString *mutableStr = [NSMutableString stringWithString: @"hello word!"];
NSString *strCopy = [mutableStr copy] // 內容復制
NSMutableString *strMCopy = [mutableStr mutableCopy] // 內容復制
二敦锌、集合類對象的copy與mutableCopy (同上)
在集合類對象中,對不可變對象進行copy操作磕道,是指針復制供屉,mutableCopy操作是內容復制;
對可變對象進行copy和mutableCopy都是內容復制溺蕉。但是:集合對象的內容復制僅限于對象本身伶丐,對集合內的對象元素仍然是指針復制。(即單層內容復制)
NSArray *arr = @[@[@"a", @"b"], @[@"c", @"d"];
NSArray *copyArr = [arr copy]; // 指針復制
NSMutableArray *mCopyArr = [arr mutableCopy]; //單層內容復制
NSMutableArray *array = [NSMutableArray arrayWithObjects:
[NSMutableString stringWithString:@"a"],@"b",@"c",nil];
NSArray *copyArr = [mutableArr copy]; // 單層內容復制
NSMutableArray *mCopyArr = [mutableArr mutableCopy]; // 單層內容復制"
總結一句話
只有對不可變對象進行copy操作是指針復制(淺拷貝)疯特,其它情況都是內容復制(深拷貝)哗魂!