文章目录
深、浅复制
差别
浅拷贝获得的对象的地址和原有对象的地址一致
而深拷贝返回新的内存地址,并且返回的对象为可变对象
1、非容器 + 不可变对象(NSString) + retain + copy + mutableCopy
- retain和copy为浅复制
- mutableCopy为深复制
2、非容器 + 可变对象(NSMutableString) + retain + copy + mutableCopy
- retian对可变对象为浅复制
- copy对可变对象非容器类为深复制
- mutableCopy对可变非容器类为深复制
3、容器类 + 非可变对象 + retain + copy + mutableCopy
- retain和copy为浅复制
- mutableCopy为深复制
- 这里对容器的深复制,实际上是不完全深复制,对于容器内的元素,依然是浅复制的形式,只复制了地址,没有复制内容。
4、容器类 + 可变对象 + retain + copy + mutableCopy
- retain为浅复制
- copy和mutableCopy为深复制
- 这里对容器的深复制,实际上是不完全深复制,对于容器内的元素,依然是浅复制的形式,只复制了地址,没有复制内容。
进行容器类完全深复制的2种方法
1、用 initWithArray:copyItems: 将第二个参数设置为YES即可深复制
NSDictionary shallowCopyDict = [[NSDictionary alloc] initWithDictionary:someDictionary copyItems:YES];
这样就可以把dataArray1的内容完全深复制到dataArray2中了。
2、使用基础框架的归档功能:
dataArray2 = [NSKeyedUnarchiver unarchiveObjectWithData:
[NSKeyedArchiver archivedDataWithRootObject: dataArray1]]
归档
既然接触到归档,就简单了解下归档吧。
归档是指,在字典,数组,自定义的对象等需要存储时,转换为字节流NSData类型数据,再通过写入文件来进行存储。
因此,归档常用于离线缓存,将有网时的数据存放在本地;也可以缓存用户搜索历史记录。
归档的代码:
NSKeyedArchiver *archvier = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
这里的data就是要转成字节流的对象。
相对应的解档:
[NSKeyedUnarchiver unarchiveObjectWithData:archvier];
感觉平时用不太到,也没深入了解。