深拷贝与浅拷贝
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];
,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];
相关文章推荐
- 多校第四场 1010 hdu 5336 XYZ and Drops(bfs+模拟)
- 004.添加pch文件_项目配置
- HashMap遍历,推荐使用entrySet()
- JQuery的AJAX封装加例子
- 基于HTML5 Tab选项卡动画切换特效
- 动态 SQL、EXECUTE IMMEDIATE、using、into、returning
- HDU1142——A Walk Through the Forest(spfa+记忆化搜索)
- 屡被打假,互联网创业者错在哪了?
- 图片上传类(C#)
- 小细节大作为:提高iOS访问权限通过率有这几个办法
- pat(B) 1001. 害死人不偿命的(3n+1)猜想
- JS知识一:系统知识笔记总结
- 【正则表达式学习】元字符
- mysql的常用查询辅助函数汇总
- 使用POI导入EXCEL报java.lang.IncompatibleClassChangeError
- vector之妙用系列
- 2015/7/31 由于昨天上升缺乏量的支持,今天横盘;在箱体下边缘稍微买了一点---错误!;复文《揭秘主力坐庄流程 内幕超乎想象》,
- 从Android L默认ART虚拟机看国内手机圈
- python的函数定义
- CSDN 博客排名第一名和第二名博客截图