您的位置:首页 > 其它

深拷贝与浅拷贝

2015-07-31 14:25 323 查看
以后定义属性,逢NSString
,NSarray ,NSDitionary,写copy比写retain更安全,防止外界给你赋值一个可变对象,赋值完之后对可变对象做修改,会导致已经赋过值的也会被改动,使用copy的话,内不会拷贝出一个新对象,源对象做修改,赋值过的不变

郑重警告:
此种方法,不适用于
NSMutableString,NSMutableArray,NAMutableDitionary,NSMutableset,因为一旦赋值,就会拷出一个不可变的对象,就不能修改内容了

对于
NSString ,NSArray ,NSDictionary ,NSSet,
对于copy是浅拷贝(拷贝指针),copy相当于retain

对于NSString ,NSMUtableArray,NSMutableDictionary, NSMUtableSet ,
对它拷贝是深拷贝(拷贝内容),会拷出一个新对象,拷贝出的新对象是不可变对象

对于NSString ,对它是浅拷贝(拷贝指针),copy相当于retain

对于NSString ,对它拷贝是深拷贝(拷贝内容),会拷出一个新对象,拷贝出的新对象是不可变对象

浅拷贝
(拷贝需要遵守
NSCopying协议)

NSString * string = [NSString stringWithFormat:@"蓝鸥"];

NSLog(@"%lu",[string retainCount]);

NSLog(@"%p",string);

NSString * newString = [string copy];

NSLog(@"new %lu",[newString retainCount]);

NSLog(@"%p",newString); //仅仅是引用计数加1,地址没变

深拷贝,内容不可变

NSMutableString * string1 = [NSMutableString stringWithFormat:@"蓝鸥科技"];

NSLog(@" %lu ",[string1 retainCount]);

NSLog(@"%p",string1);

NSString * newString1 = [string1 copy];

[newString1 deleteCharactersInRange:NSMakeRange(2, 2)]; //不可变的不可以删除

NSLog(@" new1 %lu ",[newString1 retainCount]);

NSLog(@"%p",newString1);

对于mutableCopy,是是深拷贝,会拷贝出一个新对象,新对象是可变的

不可变的
新对象是可变的

NSString * string2 = [NSString stringWithFormat:@"蓝鸥科技"];

NSLog(@" %lu ",[string2 retainCount]);

NSLog(@"%p",string2);

NSMutableString * newString2 = [string2 mutableCopy];

[newString2 deleteCharactersInRange:NSMakeRange(2, 2)];

NSLog(@"new2 %lu ",[newString2 retainCount]);

NSLog(@"new2 %p",newString2);

可变的
新对象是可变的

NSMutableString * string3 = [NSMutableString stringWithFormat:@"蓝鸥科技"];

NSLog(@" %lu ",[string3 retainCount]);

NSLog(@"%p",string3);

NSMutableString * newString3 = [string3 mutableCopy];

[newString3 deleteCharactersInRange:NSMakeRange(2, 2)];

NSLog(@"new3 %lu ",[newString3 retainCount]);

NSLog(@"new3 %p",newString3);

NSMutableString * string = [NSMutableString stringWithFormat:@"蓝鸥科技"];

Person * person = [[Person alloc] init];

person.name = string;

[string deleteCharactersInRange:NSMakeRange(2, 2)]; //若是retain,赋给可变的,删除会影响给name赋值

[person sayHI];

[person release];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: