1.前言
开发过程中常常需要拷贝属性、容器、模型,修改拷贝对象,是否会对原对象产生影响等,这就是 copy
与mutableCopy
的区别
2.copy与mutableCopy的官方解释
- copy = 浅拷贝
- 拷贝了对象的指针,两者指向同一内存地址
- 拷贝对象与原对象的关系就是
影子与本尊
的关系
mutableCopy
产生了一个新的对象, copy
修饰的对象则指向了同一内存地址
- 被拷贝对象为NSMutableString
无论是 mutableCopy
还是copy
产生的对象都是新对象。
适用于NSArray
NSMutableArray
NSDictionary
NSMutableDictionary
4.自定义对象实现深浅拷贝
- 声明自定义类,如果不实现
NSCopying
,NSMutableCopying
协议,则不具备深浅拷贝的能力 - 使用runtime实现拷贝
- (id)copyWithZone:(NSZone *)zone {
Warrior *warer = [Warrior new];
unsigned int count = 0;
objc_property_t *properties = class_copyPropertyList(self.class, &count);
for (int i = 0; i<count; i++) {
objc_property_t propertyNameString = properties[i];
const char *name = property_getName(propertyNameString);
NSString *propertyName = [NSString stringWithUTF8String:name];
id value = [self valueForKey:propertyName];
if (value) {
[warer setValue:value forKey:propertyName];
}
}
free(properties);
return warer;
}
// or
- (id)copyWithZone:(NSZone *)zone {
Striker *ster = [Striker new];
ster.name = @"athey";
ster.gunshot = 550.f;
return ster;
}
5.Property修饰符copy与strong的区别
- copy修饰符
@property (nonatomic, strong) NSMutableArray *skills;
NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"fire",@"water",@"ice", nil];
warer.skills = arr;
- 这里的赋值操作就是执行setter方法
- (void)setSkills:(NSMutableArray *)skills{
// copy修饰符 生成新的对象
_skills = [skills copy];
}
- 生成新的对象且不可变
// 如果执行 NSMutableArray的方法,则会crash
[warer.skills addObject:@"soil"];
crash
Demo地址
个人Blog:allenchou.xyz
网友评论