copy和mutableCopy的区别
深拷贝和浅拷贝的区别
在OC中对象的拷贝方式有两种:深拷贝和浅拷贝.浅拷贝:并不拷贝对象本身,仅仅是拷贝指向目标对象的指针,并没有拷贝内容; 深拷贝:直接拷贝整个对象内容到另外一块内存中.
总结一句话: 浅拷贝就是拷贝指针,深拷贝就是拷贝内容
系统对象的copy和mutableCopy方法
1.copy方法用于拷贝对象的副本,通常来说copy方法总是返回对象的不可变的副本.即使原来的对象是可变的.例如[NSMutableString copy] 返回的依旧是 不可变 的字符串对象
2.mutableCopy方法用于拷贝对象的可变副本 .通常来说mutableCopy方法总是返回对象的可变副本.即使被拷贝的对象是不可变的.例如:[NSString mutableCopy]返回的是 可变字符串对象
NSString,NSMutableString,NSArray,NSMutableArray,NSDictionary,NSMutableDictionary分别调用copy和mutableCopy总结
拷贝的副本对象类型:
copy -->不管原来的对象是什么类型 拷贝后返回的都是 不可变对象
mutableCopy -->不管原来的对象是什么类型,拷贝后返回的都是 可变对象
是否产生新的对象:
只有不可变对象的 copy方法,才不产生新的对象,其他的都会产生新对象
拷贝的类型区分:
不产生新对象的拷贝就是浅复制,其他都是深复制
自定义对象的拷贝
自定义对象要实现copy方法,需要实现NSCopying协议和实现CopyWithZone这个协议方法.不实现的话 会报 copy方法未实现的 错误
自定义对象拷贝代码实现:
@interface CopyPerson : NSObject<NSCopying> //要实现NSCopying协议
@property (nonatomic,copy) NSString *name;
@property (nonatomic,copy) NSString *address;
@property (nonatomic,assign)NSInteger age;
@end
实现协议方法:
-(id)copyWithZone:(NSZone *)zone{
CopyPerson *person = [[[self class] allocWithZone:zone] init];
person.name = self.name;
person.age = self.age;
person.address = self.address;
return person;
}
使用copy:
CopyPerson *person = [[CopyPerson alloc] init];
person.name = @"xmg";
person.address = @"中国";
person.age = 24;
CopyPerson *newPerson = [person copy];
NSLog(@"newPerson.name = %@,newPerson.address = %@,newPerson.age = %ld ",newPerson.name,newPerson.address,newPerson.age); // xmg 中国 24
网友评论