iOS对象深浅拷贝总结

一、非集合对象(NSString、NSNumeber)

在非集合类对象中:对immutable对象(不可变对象)进行copy操作,是指针复制,mutableCopy操作时内容复制;对mutable对象进行copy和mutableCopy都是内容复制。用代码简单表示如下:

[immutableObject copy] // 浅复制
[immutableObject mutableCopy] //深复制
[mutableObject copy] //深复制
[mutableObject mutableCopy] //深复制

二、集合对象(NSArray、NSDictionary)

在集合类对象中,对immutable对象进行copy,是指针复制,mutableCopy是内容复制;对mutable对象进行copy和mutableCopy都是内容复制。但是:

集合对象的内容复制仅限于对象本身,对象元素仍然是指针复制。

用代码简单表示如下:

[immutableObject copy] // 浅复制
[immutableObject mutableCopy] //单层深复制
[mutableObject copy] //单层深复制
[mutableObject mutableCopy] //单层深复制
总结:拷贝前与拷贝后,有一方是可变对象,即是深拷贝,反之。

另外补充两点:

三、如何对集合对象进行元素复制

目前我所用的的是将集合进行归档(archive),然后解档(unarchive),如:

NSArray *trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:oldArray]];

四、修改 NSString 的原理

NSString *str = @"string";
str = @"newString";

打印修改前后地址:

2017-01-09 11:40:14.684752 [2413:942207] 修改前:0x750d8
2017-01-09 11:40:14.684845 [2413:942207] 修改后:0x750f8

其实地址是发生改变的,按照我们的经验,初始化一个字符串之后,字符串的首地址就被确定下来,不管之后如何修改字符串内容,这个地址都不会改变。
但此处第二行并不是对 str 指向的内存地址重新赋值,因为赋值操作符左边的 str 是一个指针,也就是说此处修改的是内存地址。

你可能感兴趣的:(iOS对象深浅拷贝总结)