96SEO 2026-02-20 07:42 0
贝copy与mutablecopycopy与mutablecopy的简介示例不可变对象的复制可变对象的复制

NSCopying和NSMutableCopying协议深复刻和浅复刻浅拷贝Shallow
copy和mutablecopy都是NSObeject所提供用来复制对象的方法但它们有着不同的行为主要区别如下
方法用于创建一个不可变的副本无论原始对象是可变的还是不可变的。
对于不可变对象copy
方法仅仅是增加了引用计数返回的仍然是原始对象本身。
对于可变对象copy
方法用于创建一个可变的副本无论原始对象是可变的还是不可变的。
对于不可变对象mutableCopy
方法会创建一个新的可变对象内容与原始对象相同。
对于可变对象mutableCopy
mutableCopy];NSLog(%p,str1);NSLog(%p,str2);NSLog(%p,strcopy);NSLog(%p,strmutablecopy);}return
,指向的都为同一内存区域为浅拷贝由于mutablecopy生成了新的NSMutableString所以系统为其重新开辟一块空间进行了深拷贝。
stringWithString:hello];NSString
appendString:,bb];[mstrmutablecopy
appendString:,cc];NSLog(%p,mstr);NSLog(%p,mstrcopy1);NSLog(%p,mstrcopy2);NSLog(%p,mstrmutablecopy);}return
}对于注释的那一句代码由于mstrcopy是通过copy方法得来类型为NSString是不可变的所以后面无法进行追加。
可以发现通过copy得到的字符串指向的是同一片地址但是复制得到的地址相对于原来的mstr都是不同的所以我们可以知道对于可变对象进行copy和mutablecopy都是进行深拷贝。
虽然NSObject虽然都给出了copy和mutablecopy的方法但是不一定在任何时候都能够使用为了确保一个对象可以调用copy方法复制得到自身的不可变副本我们需要做如下事情
让该类实现NSCopying协议让该类实现copyWithZone方法
实现NSMutableCopying协议让该类实现mutableCopyWithZone方法
Foundation/Foundation.hinterface
copy];NSLog(%,copy1);copy1.name
20;NSLog(%,org);NSLog(%,copy1);}return
}从以上程序我们看出来我们对org进行一次副本复制对得到的copy的成员变量进行赋值对org不会产生影响。
Foundation/Foundation.hinterface
Copy是在编程中经常遇到的两个概念它们描述了在复制对象时复制的内容的不同程度。
浅拷贝是指将一个对象复制到一个新的对象中即将对内存指针的复制并增加其引用计数。
如果对象包含其他对象的引用浅拷贝将不会复制这些引用的对象而是将其引用复制到新对象中。
因此新对象和原对象中的引用指向相同的对象。
如果其中一个对象修改了共享对象另一个对象也会受到影响。
当使用A指针改变内容时B指针指向的内容也会跟着改变
深拷贝是指将一个对象递归复制到一个新的对象中开辟一片新的空间并且复制所有引用的对象直至没有任何共用的部分。
这意味着新对象中的每个对象都是原始对象的副本而不是共享的。
因此如果其中一个对象修改了它指针所指向的对象另一个对象不会受到影响。
对于上图来说分配了新的内存改变A指针指向的值不会影响到指针B指向值的内容。
通常情况下浅拷贝的效率比深拷贝高因为它不需要递归地复制所有引用的对象。
但是在需要保持对象之间的独立性时深拷贝是必需的。
Foundation/Foundation.hinterface
copy];NSLog(%,copy1);[copy1.name
replaceCharactersInRange:NSMakeRange(0,2)
20;NSLog(%,copy1);NSLog(%,org);}return
似乎很奇怪我们通过repalce的函数去修改字符串使得org和copy的字符串内容都发生了改变想要解决这个问题我们可以画一个图来辅助我们进行理解。
对于即将被复制的org来说变量name之中存储的是字符串的地址指针而不是字符串本身如果进行copy.name
self.age;那么只是将字符串的地址赋给copy之中的name属性实际上两者指针都指向一个相同的NSMutableString类型字符串。
对于这种复制模式我们就称之为浅复制在内存中复制一个对象但是原来的和复制得到的内容指向一个相同的对象也就是说两个对象都存在依然存在的部分
那如果要实现深复制呢前面说过深复制不仅会对对象本身进行复制而且还会递归复制每一个指针的属性直到两者没有共同的部分。
我们将copyWithZone的代码进行一些修改就能实现深复制的原理。
}我们将原对象的属性值复制了一份可变的副本再将新的可变副本的内容赋值给新对象的name属性与原先的对象再无共用的部分实现了深复制
一般来说实现深复制的难度很大对于包含大量指针属性的对象来说更或者对象中的变量中又嵌套了一层指针的话那会更加复杂
方法中会执行深复制操作。
这意味着在设置属性值时会创建一个属性值的副本而不是直接引用传入的对象。
方法中首先进行了对象的比较确保新值和旧值不是同一个对象。
然后使用
_name。
这样做可以确保属性值的安全性防止外部对象对属性值的意外修改。
操作实际上是执行了浅复制它只会复制对象的指针而不会复制对象本身。
这意味着它会创建一个新的指针指向相同的内存地址而不是创建一个完全独立的副本。
属性。
对于可变对象而言使用copy可能会导致意外的行为。
因为修改一个对象会影响到所有指向该对象的指针。
这就是为什么使用
属性时需要小心特别是。
另外如果属性值是可变对象那么每次设置属性值时都会创建一个新的不可变副本这样会导致性能开销增加。
属性通常适用于容器类对象和其他可复制的对象但对于自定义类对象需要确保其实现了
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback