定义:
- 浅拷贝:并不拷贝对象本身,仅仅是拷贝指向对象的指针
- 深拷贝:直接拷贝整个对象内容到另一块内存中
再简单些说:浅拷贝就是指针拷贝;深拷贝就是内容拷贝。
copy和mutbleCopy的区分:
在非集合类的对象中(例如NSString):
[string copy] // 浅拷贝
[string mutableCopy] //深拷贝
[mutableString copy] //深拷贝
[mutableString mutableCopy] //深拷贝
在集合类的对象中(例如NSArray):
[array copy] // 浅拷贝
[array mutableCopy] //单层深拷贝
[mutableArray copy] //单层深拷贝
[mutableArray mutableCopy] //单层深拷贝
这里的单层深拷贝(one-level-deep copy)是指集合对象中可能会包含指针类型的实例变量,所以值拷贝了Array,而其中的元素知识浅拷贝。
自定义对象的拷贝
在OC中不是所有的类都支持拷贝,只有遵循<NSCopying>才支持copy,只有遵循<NSMutableCopying>才支持mutableCopy。如果没有遵循,拷贝时会直接Crash。
例如自定义一个Person的类:
@interface Person : NSObject<NSCopying>
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger age;
@end
要想实现对person的拷贝即:
//自定义对象的复制
- (void)testPerson {
Person *person1 = [[Person alloc] init];
person1.age = 20;
person1.name = @"小李";
Person *person2 = [person1 copy];
NSLog(@"person1_p: %p", person1);
NSLog(@"person2_p: %p", person2);
}
则在person中必须实现copyWithZone的方法,即:
- (nonnull id)copyWithZone:(nullable NSZone *)zone {
Person *person = [[[self class] allocWithZone:zone] init];
person.name = self.name;
person.age = self.age;
return person;
}
否则程序会崩溃,同理NSMutableCopy也是如此。
参考文章:
https://www.jianshu.com/p/33f175d97b86
https://www.jianshu.com/p/b0aa9100db16
http://www.cocoachina.com/ios/20170314/18865.html
网友评论