iOS深复制和浅复制
2016-05-18 09:31
393 查看
1、copy关键字
1> 浅拷贝与深拷贝
浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间。
深拷贝是指拷贝对象的具体内容,而内存地址是自主分配的,拷贝结束之后,两个对象虽然存的值是相同的,但是内存地址不一样,两个对象也互不影响,互不干涉。
2> copy和mutableCopy
copy:对于可变对象为深复制,引用计数不改变;对于不可变对象是浅复制,引用计数每次加一。始终返回一个不可变对象。
mutableCopy:始终是深复制,引用计数不改变。始终返回一个可变对象。
3> 自定义类copy的实现
步骤:
1、导入<NSCopying>协议
2、实现copyWithZone方法
3、[object copy]
注意:自定义对象中包含其它对象指针时,要考虑深复制与浅复制的问题
举例:
- (id)copyWithZone:(nullable NSZone *)zone {
Person * p = [[Person alloc] init];
p.age = _age;
p.name = _name;//浅复制
p.dog = [_dog copy];//深复制
return p;
}
4> 为什么用copy修饰NSString,而不是strong?
因为父类指针可以指向子类对象,使用copy的目的是为了让本对象的属性不受外界影响,使用copy无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本,如果我们使用是strong,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性.
1> 浅拷贝与深拷贝
浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间。
深拷贝是指拷贝对象的具体内容,而内存地址是自主分配的,拷贝结束之后,两个对象虽然存的值是相同的,但是内存地址不一样,两个对象也互不影响,互不干涉。
2> copy和mutableCopy
copy:对于可变对象为深复制,引用计数不改变;对于不可变对象是浅复制,引用计数每次加一。始终返回一个不可变对象。
mutableCopy:始终是深复制,引用计数不改变。始终返回一个可变对象。
3> 自定义类copy的实现
步骤:
1、导入<NSCopying>协议
2、实现copyWithZone方法
3、[object copy]
注意:自定义对象中包含其它对象指针时,要考虑深复制与浅复制的问题
举例:
- (id)copyWithZone:(nullable NSZone *)zone {
Person * p = [[Person alloc] init];
p.age = _age;
p.name = _name;//浅复制
p.dog = [_dog copy];//深复制
return p;
}
4> 为什么用copy修饰NSString,而不是strong?
因为父类指针可以指向子类对象,使用copy的目的是为了让本对象的属性不受外界影响,使用copy无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本,如果我们使用是strong,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性.
相关文章推荐
- iOS深入学习(Block全面分析)
- iOS开发——响应链(Responder Chain)的深入理解和代码示例
- [置顶] iOS在沙盒Documents中创建文件夹以及获取沙盒路径
- ios 9.0获取用户位置
- 获取用户位置ios8.0以上适配
- ios 获取用户的位置
- iOS模块化之路(一)
- 【代码笔记】iOS-两个滚动条,上下都能滑动
- iOS中NSUserDefaults的用法(轻量级本地数据存储)
- iOS - block
- iOS开发之断点续传原理与实现
- iOS支付宝支付--密钥制作
- WIN8/8.1/10进入BIOS方法图解
- WIN8/8.1/10进入BIOS方法图解
- iOS开发中短信提醒功能详解步骤
- iOS下Date.parse失效的解决方法
- [工具] iOS 单张图片查看器
- [工具] iOS 相机选择器
- [实践]iOS 夜间模式
- [基础]iOS 单元测试(一)入门与配置