copy 和 mutableCopy的区别
1.字符串拷贝
copy
浅拷贝,不拷贝对象本身,仅仅是拷贝指向对象的指针。
NSString *str1 = @"qqq";NSString *str2 = [str1 copy];NSLog(@"\nstr1 = %@ str1P = %p \n str2 = %@ str2P = %p", str1, str1, str2, str2);
//运行结果
str1 = qqq str1P = 0x101d54100 str2 = qqq str2P = 0x101d54100
str1 = @"sss";
NSLog(@"%@---%@----%p---%p",str1,str2,str1,str2);
//运行结果 sss---qqq----0x1080a4140---0x1080a4100
那为什么NSString *str2 = [str1 copy];
是不同的指针指向同一块内存空间,str1 从新赋值 后两个内存空间就不一样了呢?
因为str2 = str1
的时候,两个字符串都是不可变的,指向的同一块内存空间中的 @"str1"
,是不可能变成@"abcd"
的。所以这个时候,为了优化性能,系统没必要另外提供内存,只生成另外一个指针,指向同一块内存空间就行。
但是当你从新给 str1
或者str2
赋值的时候,因为之前的内容不可变,还有互不影响的原则下,这个时候,系统会从新开辟一块内存空间。
NSMutableString *mstr1 = [[NSMutableString alloc]initWithString:@"123"];
NSMutableString *mstr2 = [mstr1 copy];
NSLog(@"%@---%@--%p---%p",mstr1,mstr2,mstr1,mstr2);
NSMutableString *mstr3 = [mstr1 mutableCopy];
NSLog(@"%@---%p",mstr3,mstr3);
copy 和 mutableCopy 当 immtable 对象调用copy方法 返回的是 immtable对象 immtable 调用 mutablecopy返回 mutable
2.相对数组而言
@property (nonatomic, copy) NSMutableArray *mArr;
NSArray *arr = @[@"123", @"456", @"asd"];
self.mArr = [arr mutableCopy];
NSLog(@"\n arrP = %p \n self.mArrP = %p, self.mArr class = %@", arr, self.mArr, [self.mArr class]);
可以看出内存地址不一样,但是_mArr
是不可变的数组。
因为 _mArr
声明的时候是用 copy
修饰,那么就限制了他为不可变的数组。 赋值的时候是用mutableCopy
,可变数组的复制方法,所以会从新分配内存。
//运行结果
arrP = 0x600003a6ebb0
self.mArrP = 0x600003a6eb20, self.mArr class = __NSArrayI
- 用copy修饰的 或者赋值的 变量肯定是不可变的。
- 用copy赋值,要看源对象是否是可变的,来决定只拷贝指针,还是也拷贝对象到另一块内存空间
- 对象之间mutableCopy赋值,肯定会拷贝整个对象内存到另一块内存中
- 对象之间赋值之后,再改变,遵循互不影响的原则
copy 和 mutableCopy的区别相关推荐
- Copy 与MutableCopy的区别
NSString *string = @"origion"; NSString *stringCopy = [string copy]; NSMutableString *stri ...
- copy与mutableCopy的区别总结
1.不可变类型(不管是集合还是非集合),copy结果,不产生新对象,浅拷贝: 不可变类型(不管是集合还是非集合),mutableCopy结果,产生新对象,深拷贝. 2.可变类型(不管是集合还是非集合) ...
- iOS开发-retain/assign/strong/weak/copy/mutablecopy/autorelease区别
依旧本着尊重原创和劳动者的原则,将地址先贴在前面: http://www.cnblogs.com/nonato/archive/2013/11/28/3447162.html,作者Nonato 以下内 ...
- object-c语言的nonatomic,assign,copy,retain的区别
nonatomic: 非原子性访问,不加同步,多线程并发访问会提高性能.如果不加此属性,则默认是两个访问方法都为原子型事务访问. (atomic是Objc使用的 ...
- copy模块中的copy与deepcopy的区别
前言 每空闲下来,就觉得以前写的博客很low........也许现在也很low~~~~好吧就当升级版的low吧~~~~ 如果要了解copy与deepcopy的区别,就需要了解Python的存储机制:P ...
- nonatomic,assign,copy,retain的区别
nonatomic:非原子性访问,不加同步,多线程并发访问会提高性能.如果不加此属性,则默认是两个访问方法都为原子型事务访问. (atomic是Objc使用的一 ...
- [Objective-C] Copy 和 MutableCopy
看了几篇文章,因为文章很新手向,所以内容很繁琐.故整理一下重点,写了测试程序去了解几个知识点,不讨论基本概念.新博客wossoneri.com传送门 非集合类对象的copy与mutableCopy / ...
- retain和copy还有assign的区别
retain和copy还有assign的区别 1. 假设你用malloc分配了一块内存,并且把它的地址赋值给了指针a,后来你希望指针b也共享这块内存,于是你又把a赋值给(assign)了b.此时a和b ...
- strong、copy和mutableCopy详解
写在前面 关于copy.mutableCopy和strong,一直想好好整理整理,但是因为各种原因搁置了.今天上班时发现老代码中因为这个问题出现了一个特别恶心的大坑,让我下定决心写下这篇博文.如果你认 ...
最新文章
- Varnish使用小结
- shuffleNetv2 测试
- Python常用模块之sys模块
- VTK:Qt之ImageDataToQImage
- ECMAScript 2019(ES10)新特性简介
- 德国同事Heiko开发的ABAP工具,能检测HANA数据库执行SQL的CPU time
- react开发_我如何在#100DaysOfCode挑战期间找到React开发人员的工作
- PHP代码规范[转]
- mongodb常用语句(集合操作)
- kali linux引导文件修复,Kali+Windows引导修复
- charset参数 sqluldr2_sqluldr2使用几例
- 软考高项 : (27)信息系统项目管理师模拟试题
- surface pro win10 重装系统并解决屏幕亮度闪烁和降频的问题
- CBOW(Continous Bag of Words)模型学习(2020-08-19)
- AQS(AbstractQueuedSynchronizer)同步器
- ubuntu出现有线已连接却无法上网的解决方法(ubuntu连不上网)
- c++工作宝贵经验呀,我去。。。。
- 群晖|半洗白后moments正常显示人像、主题、预览
- 叮! Q币派送中,快来看看你中奖了吗?
- 穷不是中年危机的理由