<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">copy/Muable语法的本质是:产生新对象, 在改变新对象时, 不改变源对象</span>
1>调用copy返回的是不可变的,调用mutablecopy返回的是可变的
2>不可变类型的对象调用copy方法, 是浅拷贝(指针拷贝, 地址拷贝), 新对象和源对象指向的是同一个对象, 源对象的计数器+1变成2
3>其他情况下, 都是产生新对象, 源对象的计数器不变, 新对象的计数器置为1
系统自带类的拷贝
#pragma mark - NSString的copy(浅拷贝,指针拷贝, 地址拷贝)
//不可变copy---->不可变, 只是地址(指针)的拷贝,新对象和源对象指向同一对象,源对象的计数器+1变成2
NSString *string = [[NSString alloc] initWithFormat:@"age is %i", 10];
NSLog(@"%zi", [string retainCount]);//
NSString *str = [string copy];// 返回不变的,为了性能着想, 干脆返回源对像, 相当于retain
NSLog(@"%zi", [str retainCount]);
//产看是否产生新的对象
BOOL isEqual = (str==string);
NSLog(@"isEqual = %i", isEqual);// 1 是同一个对象
NSLog(@"string = %p, str = %p", string, str);//通过打印内存地址诶查看, 内存地址相等
[str release];
[string release];
#pragma mark - NSString的MutabelCopy(深拷贝)对象拷贝
//深拷贝(对象拷贝), 源对象计数器不变, 新计数器置1
NSString *string = [[NSString alloc] initWithFormat:@"age is %i", 10];
NSLog(@"%zi", string.retainCount); //1
NSMutableString *str = [string mutableCopy];
NSLog(@"%zi", str.retainCount); //1
[str appendString:@" abcd"];
BOOL isEqual = (str==string);
NSLog(@"isEqual = %i", isEqual);// 0
NSLog(@"string = %@", string); //string = age is 10
NSLog(@"str = %@", str); //str = age is 10 abcd
#pragma mark - NSMutableString的copy(深拷贝)
NSMutableString *string = [[NSMutableString alloc] initWithFormat:@"age is %i", 10];
NSLog(@"%zi", string.retainCount); //1
NSString *str = [string copy];
NSLog(@"%zi", str.retainCount); //1
[string appendString:@" abcd"];
NSLog(@"string = %@", string); //string = age is 10 abcd
NSLog(@"str = %@", str); //str = age is 10
#pragma mark - NSMutableString的MutableCopy(深拷贝)
NSMutableString *string = [[NSMutableString alloc] initWithFormat:@"age is %i", 10];
NSLog(@"%zi", string.retainCount);
NSMutableString *str = [string mutableCopy];
NSLog(@"%zi", str.retainCount);
[string appendString:@" abcd"];
[str appendString:@"lllllll"];
NSLog(@"string = %@", string); //string = age is 10 abcd
NSLog(@"str = %@", str); //str = age is 10lllllll