OC中的copy

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];

你可能感兴趣的:(OC中的copy)