定义:
1.copy:不可变复制
2.mutableCopy:可变复制
实现协议:
1.copy:实现NSCopying协议
2.mutableCopy:实现NSMutableCopying协议
副本:
1.copy:
a.如果是不可变的比如NSString,只复制了指针,并没有创建新的实例,引用计数并没有改变,相当于retain.
b.如果是可变的 比如NSMutableString, 复制了新的内容,创建了一个新的immutable!!不可变实例。
2.mutableCopy:
a.如果是不可变的比如NSString, 复制内容,创建新的可变的mutable实例
b.如果是可变的比如NSMutableString,复制内容,穿件新的mutable!!可变的实例。
copy与strong的区别
两个的区别主要在于setter方法的区别,说到底就是不同修饰符对应不同的setter方法。
@property (strong, nonamatic) NSMutableString *strongString;
@property (copy, nonatomic) NSMutableString *copyString;
- (void)setStrongString:(NSMutableString *)strongString {
[_strongString release];
_strongString = [strongString retain];
}
- (void)setCopyString:(NSMutableString *)copyString {
[_copyString release];
_copyString = [copyString copy];
}
再举个例子:
@property (strong,nonatomic) NSArray*bookArray1;
@property (copy,nonatomic) NSArray*bookArray2;
NSMutableArray*books = [@[@"book1"] mutableCopy];
Person *person = [[Person alloc] init];
person.bookArray1= books;
person.bookArray2= books;
[books addObject:@"book2"];
NSLog(@"bookArray1:%@",person.bookArray1);
NSLog(@"bookArray2:%@",person.bookArray2);}
可以看到bookArray1 与可变数组books指向同一块内容区域,books内容改变,所以bookArray1内容也随之改变。
而bookArray2,因为使用copy,在books被改变前其实复制了books的内容到一个新的内容区域里面,后面虽然改变了books但是,由于并不是一块地址,所以并不改变内容。