Objective C: 浅复制与深复制
2015-08-03 15:27
573 查看
一、深浅复制的概念
**浅复制:之复制对象内实例变量的指针地址,而不是真正复制这个对象的复制叫做浅复制;深复制:不仅复制对象本身,而且会递归地去复制每个指针类型的实例变量,一直到两个对象不再共享任何共用部分;**
二、深浅复制的写法示例
深复制的写法:假设这里有一个类叫做Book,类中的变量有 name书名(NSString) 和 price价格(double) , 所有复制需要是深复制
- (id) copyWithZone: (NSZone*) zone { //使用zone参数创建对象 Book* book = [[[self class] allocWithZone: zone] init]; //将原有对象的name变量复制一份可修改的副本赋值给新对象 book.name = [self.name mutableCopy]; book.price = self.price; return book; }
在上面的代码中,如果把book.name属性赋值的语句的右值直接写成:self.name 的话, 就是浅复制的实现了,它会复制一个同样指向原来书名的NSString*给book.name。原对象或者book任意一个改变了name的值,都会引起另一个的值改变。
一般来说,深复制的难度是比较大的,尤其是一个对象包含了大量的指针类型变量时,如果某些指针变量指向的实例又包含了指针变量,那么深拷贝的实现会变得更加复杂一些。
Foundation框架中的大多数类都只是实现了浅复制。
注:
这里要重新提一下settter方法中的复制选项:例如:
@interface Book: NSObject @propetry (nonatomic, copy) NSMutableString* name; @end
只要一个类中的实例变量的setter复制选项被声明为copy,那么在对这个变量赋值的时候,调用的方法是[传入的name参数 copy]方法,该方法返回的结果是一个不可变的副本。这会误导一部分的人:“为什么我声明的是可变类型的字符串,但是运行时还是会在改变这个实例变量的地方出错?“ 根本原因就是setter选项设置的问题,所以在这里一定要小心取舍到底是不是要声明称为copy选项。
另外,合成setter和getter都没有提供mutableCopy选项。
相关文章推荐
- Objective-C的内省(Introspection)用法小结
- Objective-C中常用的结构体NSRange,NSPoint,NSSize(CGSize),NSRect实例分析
- Objective-C中NSLog输出格式大全
- Swift调用Objective-C编写的API实例
- Swift、Objective-C、Cocoa混合编程设置指南
- Objective-c代码如何移植为Swift代码 Objective-c代码转移到Swift过程介绍
- Swift调用Objective-C代码
- objective-c中生成随机数的方法
- 在Swift中使用Objective-C编写类、继承Objective-C类
- Swift能代替Objective-C吗?
- Objective-C 消息传递机制详解
- 在一个项目中同时使用Swift和Objective-C代码混合编程的方法
- vm安装mac os x 10.7 lion
- objective-c(一)
- objective-c(二)
- objective-c(三)
- objective-c(四)-基本数据类型以及循环和选择结构
- objective-c(六)文件分离,合成存取方法,方法多参数,局部变量,self使用(未完成)
- windows下objective-c的cocoa框架编程,可以有图形界面哟