1.所有被copy修饰的对象都会进行深copy吗?
答案:NO,例如block
全局block被copy修饰不会有任何变化
栈block被copy修饰会被copy到堆上
堆block被copy修饰,不会开辟新的内存,类似浅copy
copy/mutableCopy方法的调用
所有继承NSObject的对象都可调用,但是由于NSObject中只有声明,没有实现NSCopying和NSMutableCopying协议,所以自定义的类型调用copy/mutableCopy会报错,需要遵循并实现这两个协议
有些类默认已经实现了这两个协议,例如:NSString \NSArray\NSDictionary
像NSArray\NSDictionary等这些容器类对象只会进行单层深copy
也就是说会产生新的数组对象,但数组内的元素没有产生新对象,要想对数组进行深copy,数组内的对象元素要实现copy协议中的方法-copyWithZone:
- (id)copyWithZone:(NSZone *)zone {
Student *copy = [[[self class] allocWithZone:zone] init];
copy.name = [self.name copy];
return copy;
}
并且数组也要用:
NSMutableArray *studentsArray = [NSMutableArray new];
[studentsArray addObject:student];
NSMutableArray *studentsArrayCopy =[[NSMutableArray alloc]initWithArray:studentsArray copyItems:YES];