面试题答案
一键面试内存拷贝类型
当使用copy
修饰符修饰NSMutableString
属性时,会发生深拷贝。即创建一个新的对象,新对象与原对象在内存中是独立的,内容相同但地址不同。
特性
- 对象独立性:原
NSMutableString
对象的任何修改都不会影响通过copy
得到的新对象,反之亦然。因为它们是两个完全独立的对象。 - 不可变性:通过
copy
得到的对象是不可变的NSString
类型。即使原对象是可变的NSMutableString
,拷贝后的对象不能再进行改变内容的操作(如appendString:
等方法会报错)。
应用场景
- 数据保护:当你希望某个属性的值不被外部修改时,使用
copy
。例如,一个类持有一个字符串属性,你不希望外部传入的可变字符串在后续被修改从而影响到本类内部逻辑。 - 数据共享:当多个对象可能需要使用同一个字符串内容,但又不希望相互影响时,
copy
可以创建独立的副本供各个对象使用。
优势
- 数据安全:防止对象被意外修改,保证数据的完整性和一致性。比如在多线程环境下,避免一个线程修改字符串影响到其他依赖该字符串的线程。
- 清晰的对象语义:明确属性的不可变性,使代码逻辑更加清晰,其他开发者在使用该属性时能清楚知道其不可变特性。
问题
- 性能开销:深拷贝会创建新的对象和内存空间,相比浅拷贝(如使用
strong
修饰可变对象),在内存和时间上开销更大,特别是当原对象很大时。 - 类型转换问题:如果后续代码期望操作的是可变字符串,但因为
copy
得到的是不可变的NSString
,可能需要进行类型转换,增加了代码复杂性和出错的可能性。