IOS-Foundation-Copy

1. 基本概念:深拷贝 & 浅拷贝

深拷贝: (拷贝内容--新对象)

浅拷贝: (拷贝指针--同一份对象)

  • MutableStringcopy,MutableString的mutableCopy,stringmutableCopy均是深拷贝
  • stringcopy是潜拷贝
验证方法,观察其内存地址

Book *book = [[Book alloc] init];
Book *newBook = [book mutableCopy];
NSLog(@"book address:%p, new book address:p%",book ,newBook);

2. copy关键字作用于字符串
Example:
Person *p = [[Person alloc] init];
NSMutableString *name = [NSMutableString stringWithFormat:@"Test"];
// 使用的是MutableString,所以执行下面一句是深拷贝
p.name = name;
// 改变name的值,不会影响p.name的值
[name appendString:@"123"];
NSLog(@"name:%@",name);  //输出Test123
NSLog(@"p.name:%@",p.name);  //输出Test

上面的代码也说明了一个问题: 为什么 NSString 定义的属性要用 copy 修饰?

假设,上面的Person对象的name属性,用retain修饰的话,则改变name变量的值,则name属性也跟着改变了,均输出Test123,(改变了一个变量的值,而影响了对象的属性值,不合理),NSStringretain相当于深拷贝,copy就是潜拷贝!


3. copy关键字作用于对象
Example:
Book *book = [[Book alloc] init];
Book *newBook = [book mutableCopy];
NSLog(@"book address:%p, new book address:%p",book ,newBook);
        
book.name = @"jason";
book.age = 10;
book.no = 123;
Book *new2Book = [book copy];
NSLog(@"name:%@,age:%d,no:%d",new2Book.name,new2Book.age,new2Book.no);

需要说明的两点:

[book copy];方法调用的是

- (id)copyWithZone:(NSZone *)zone

- (id)copyWithZone:(NSZone *)zone要遵守NSCopying协议

你可能感兴趣的:(IOS-Foundation-Copy)