1. 基本概念:深拷贝 & 浅拷贝
深拷贝: (拷贝内容--新对象)
浅拷贝: (拷贝指针--同一份对象)
Book *book = [[Book alloc] init]; Book *newBook = [book mutableCopy]; NSLog(@"book address:%p, new book address:p%",book ,newBook);
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
假设,上面的Person对象的name属性,用retain修饰的话,则改变name变量的值,则name属性也跟着改变了,均输出Test123,(改变了一个变量的值,而影响了对象的属性值,不合理),NSString的retain相当于深拷贝,copy就是潜拷贝!
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协议