怎么用copy关键字?
1、NSString、NSArray,NSDictionary等经常使用copy关键字,是因为它们有可变类型
2、block也经常使用,因为在MRC中,方法内部的block是在栈区的,使用copy可以把它放在堆区,在ARC中写不写都行,对block使用strong和copy都是一样的,但是使用copy更好。
深拷贝和浅拷贝
浅拷贝就是拷贝指针,深拷贝是拷贝内容
集合的浅拷贝
进行浅拷贝,会向原始的集合发送retain消息,引用计数+1,所以copy后的指针的地址等于原来的那个集合的地址
集合的深拷贝
只是单层的深拷贝,内部的元素还是指针拷贝
不论是对集合还是非集合都适用
- [immutableObject copy] // 浅复制
- [immutableObject mutableCopy] //深复制
- [mutableObject copy] //深复制
- [mutableObject mutableCopy] //深复制
集合的深拷贝
两种方法:
1、用 initWithArray:copyItems: 将第二个参数设置为YES即可深复制
NSDictionary shallowCopyDict = [[NSDictionary alloc] initWithDictionary:someDictionary copyItems:YES];
用这种方法深复制,集合里的每个对象都会收到 copyWithZone: 消息。如果集合里的对象遵循 NSCopying 协议,那么对象就会被深复制到新的集合。如果对象没有遵循 NSCopying 协议,而尝试用这种方法进行深复制,会在运行时出错。copyWithZone: 这种拷贝方式只能够提供一层内存拷贝(one-level-deep copy),而非真正的深复制。
2、将集合进行归档(archive),然后解档(unarchive),真正意义的深复制
NSArray *trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:oldArray]];