可变对象copy和mutableCopy均是单层深拷贝,也就是说单层的内容拷贝;
NSMutableArray *element = [NSMutableArray arrayWithObject:@1];
NSMutableArray *array = [NSMutableArray arrayWithObject:element];
NSArray *copyArray = [array copy];
NSMutableArray *mutableCopyArray = [array mutableCopy];
NSLog(@"array is %p, copyArray is %p, mutableCopyArray is %p", array, copyArray, mutableCopyArray);
[mutableCopyArray[0] addObject:@2];
NSLog(@"element is %@, array is %@, copyArray is %@, mutableCopyArray is %@", element,array,copyArray, mutableCopyArray);
2017-02-22 11:53:25.286 test[91520:3915695] array is 0x600000057670, copyArray is 0x600000000bc0, mutableCopyArray is 0x6080000582a0
2017-02-22 11:53:25.287 test[91520:3915695] element is (
1,
2
), array is (
(
1,
2
)
), copyArray is (
(
1,
2
)
), mutableCopyArray is (
(
1,
2
)
)
4、自定义的类
重要说明:
1、所以的代码设计均是针对业务需求。
2、对于自定义的类,决定能否向对象发送copy和mutableCopy消息也是如此;
1、@property 声明中用 copy 修饰
不得不说下copy和strong在复制时候的区别,此处不讲引用计数的问题。
copy:拷贝一份不可变副本赋值给属性;所以当原对象值变化时,属性值不会变化;
strong:有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性;
@interface Person : NSObject
@property (nonatomic, copy) NSString *familyname;
@property (nonatomic, strong) NSString *nickname;
@end
Person *p1 = [[Person alloc]init];
NSMutableString *familyname = [[NSMutableString alloc]initWithString:@"张三"];
p1.familyname = familyname;
[familyname appendString:@"峰"];
NSLog(@"p1.familyname is %@",p1.familyname);
NSMutableString *nickname = [[NSMutableString alloc]initWithString:@"二狗"];
p1.nickname = nickname;
[nickname appendString:@"蛋儿"];
NSLog(@"p1.nickname is %@", p1.nickname);
2017-02-22 13:53:58.979 test[98299:3978965] p1.familyname is 张三
2017-02-22 13:53:58.979 test[98299:3978965] p1.nickname is 二狗蛋儿
2、类的对象的copy
此处唯一需要说明的一点就是注意类的继承。
这篇文章有非常清晰详细的说明,此处只照搬下结论:
1 类直接继承自NSObject,无需调用[super copyWithZone:zone]
2 父类实现了copy协议,子类也实现了copy协议,子类需要调用[super copyWithZone:zone]
3 父类没有实现copy协议,子类实现了copy协议,子类无需调用[super copyWithZone:zone]
4、copyWithZone方法中要调用[[[self class] alloc] init]来分配内存
5、NSCopying
NSCopying是对象拷贝的协议。
类的对象如果支持拷贝,该类应遵守并实现NSCopying协议。










