copy语法的目的是改变副本的时候,不会影响到源对象。app
1、一个对象使用copy或mutableCopy方法能够建立对象的副本。性能
2、copy - 须要先实现NSCoppying协议,建立的是不可变副本(如NSString、NSArray、NSDictonnary)spa
实现NSCoppying协议,须要实现如下方法指针
- (id)copyWithZone:(NSZone *)zone {orm
Student *copy = [[Student allocWithZone:zone] init]; 对象
//拷贝名字给副本对象。继承
copy.name = self.name;字符串
return copy;string
}it
3、mutableCopy - 须要先实现NSMutableCopying协议,建立的事可变副本(如NSMUtableString、NSMutableArray、NSMutableDictionary)
4、深复制:内容拷贝,源对象和副本指向的是不一样的两个对象。源对象引用计数器不变,副本计数器设置为1.
浅复制:指针拷贝,源对象和副本指向的是同一个对象,对象的引用计数器+1,其实至关于作了一次retain操做。
5、只有不可变对象建立不可变副本(copy)才是浅复制,其余都是深复制。
6、#pragma mark 演示字符串的拷贝(深拷贝)。
void stringMutableCopy() {
NSString *string = [[NSString alloc] initWithFormat:@"age is %i",10];
//产生了一个新对象,计数器为1.
NSMutableString *str = [string mutableCopy];
NSLog(@"str:%zi", [str retainCount]);
NSLog(@"string:%zi", [string retainCount]);
//调用mutableCopy产生的是可变副本,str和string不是相同对象。
NSLog(@"%i",str == string);
//副本改变了,源对象不变。
[str appendString:@"abcd"];
NSLog(@"string:%@",string);
NSLog(@"str:%@",str);
[str release];
[string release];
}
7、#pragma mark 演示字符串的拷贝(浅拷贝)。
void stringCopy1() {
NSString *string = [[NSString alloc] initWithFormat:@"age is %i",10];
//调用copy产生的是不可变副本,因为源对象自己就不可变,全部为了性能着想,copy会直接返回源对象自己,源对象计数器+1,str1和string是相同对象,
NSMutableString *str = [string copy];
NSLog(@"%@",string);
NSLog(@"%i", str == string);
[str release];
[string release];
}
8、#pragma mark 可变字符串的copy(深拷贝)
void mutableStringCopy() {
NSMutableString *string = [NSMutableString stringWithFormat:@"age is %i ",10];
NSString *str = [string copy];
NSLog(@"%i",str == string);
[str release];
[string release];
}
9、#pragma mark 演示Student的name的copy
void studentNameCopy() {
Student *stu = [Student studentWithName:@"abc"];
NSMutableString *string = [NSMutableString stringWithFormat:@"age is %i", 10];
stu.name = string;
[string appendString:@"123"];
NSLog(@"name = %@", stu.name);
NSLog(@"string = %@", string);
}
10、#pragma mark 演示Student的copy
void studentCopy() {
Student *stu = [Student studentWithName:@"stu"];
Student *stu1 = [stu copy];
NSLog(@"%@",stu1);
}
11、#pragma mark 演示继承的copy,GoodStudent类继承Student,Student有成员变量name,GoodStudent有成员变量age.
void goodStudentCopy() {
GoodStudent *stu = [GoodStudent goodStudentWithAge:10 andName:@"good"];
NSLog(@"%@",stu);
GoodStudent *stu1 = [stu copy];
stu1.name = @"good1";
stu1.age = 11;
NSLog(@"%zi",stu.retainCount);
NSLog(@"%zi", stu1.retainCount);
NSLog(@"%@",stu1);
[stu1 release];
}