【OC学习-26】对象的浅拷贝和深拷贝——关键在于属性是否可被拷贝
来源:互联网 发布:软件开发团队协作 编辑:程序博客网 时间:2024/04/30 10:24
对象的拷贝分为浅拷贝和深拷贝,浅拷贝就是只拷贝对象,但是属性不拷贝,拷贝出来的对象和原来的对象共用属性,即指向同一个属性地址,深拷贝则相当于不仅拷贝了一个对象还拷贝了它的属性,即完全是两个东西,只不过内容相同而已。
拷贝用到协议,如果这个类创建对象后,这个对象要被拷贝,那么这个类就需要用到拷贝协议,分两种:<NSCopying>和<NSMutableCopying>相当于一个是拷贝,另一个是拷贝后可修改。
(1)浅拷贝的案例。有一个Person类,它创建一个person1对象后,用person1再拷贝一个person2出来。
//Person类的Person.h文件#import <Foundation/Foundation.h>//因为这个类要支持拷贝,所以需要引入拷贝协议,有两种,后一种拷贝后可修改@interface Person : NSObject<NSCopying,NSMutableCopying>@property(nonatomic,copy) NSString* name;@property(nonatomic,retain) NSNumber* age;@end
//这是Person.m文件#import "Person.h"@implementation Person//这是系统函数,可以直接拷贝过来- (id)copyWithZone:(NSZone *)zone{ Person *person=[[[self class]allocWithZone:zone]init]; //默认格式 person.name=_name; //浅拷贝就是直接赋值即可 person.age=_age; //浅拷贝就是直接赋值即可 return person;}@end
//main.m文件#import <Foundation/Foundation.h>#import "Person.h"//记得引入头文件int main(int argc, const char * argv[]){ @autoreleasepool { Person *person1=[[Person alloc]init]; person1.name=@"jack"; person1.age=@18; Person *person2=[person1 copy]; NSLog(@"%p,%p",person1,person2);//输入两个对象地址,不同 NSLog(@"%p,%p",person1.age,person2.age);//输出两个对象的属性地址,相同 } return 0;}
结果:
0x1002036f0,0x100200330 //不同0x1227,0x1227 //相同
(2)深拷贝的案例。
按道理是只需要把Person.m里面的赋值语句改成下面的样子,就能实现深拷贝:
person.name=[_name copy]; person.age=[_age copy];
但是,因为cocoa优化过了,所以有如下规则:
a:如果是Foundation框架里地不可变对象,就是Array,NSString等创建的对象,直接用copy来拷贝相当于retain,也就是属性还是同一个;
b:如果是用mutableCopy来拷贝,不管是可变还是不可变对象,属性神马的都直接拷贝了一份,即真正意义上得拷贝,它拷贝出来的对象统统都是可变的;
c:如果是可变对象,我们用copy也能实现真正意义上的拷贝,但是拷贝出来的对象是不可变的。
person.name=[_name mutableCopy]person.age=[_age copy];
然后再输出person1和person2的name属性的地址,发现就不同了。
总结:
浅拷贝和深拷贝在实际项目中不常用,可以做一般了解。
0 0
- 【OC学习-26】对象的浅拷贝和深拷贝——关键在于属性是否可被拷贝
- OC学习 -- 浅拷贝和深拷贝
- oc的浅拷贝和深拷贝
- OC中的字符串属性(深拷贝和浅拷贝)
- 对象的深拷贝和浅拷贝
- Python对象的拷贝,浅拷贝和深拷贝。
- OC浅拷贝和深拷贝
- oc中的深拷贝和浅拷贝
- OC中浅拷贝和深拷贝
- OC中的浅拷贝和深拷贝
- OC 中的深拷贝和浅拷贝
- OC浅拷贝和深拷贝
- oc 深拷贝和浅拷贝
- Python对象拷贝——深拷贝与浅拷贝
- OC当中的深拷贝和浅拷贝
- OC 深拷贝、浅拷贝
- object c的浅拷贝(地址拷贝)和深拷贝(对象拷贝)
- 对象深拷贝和浅拷贝
- android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context r
- 【移动开发】在Canvas上显示动画
- 线性回归 Linear Regression, 逻辑回归 Logistic Regression 小结
- Problem I: 俊爷的局域网
- Codeforces Round #265 (div2) A. inc ARG
- 【OC学习-26】对象的浅拷贝和深拷贝——关键在于属性是否可被拷贝
- Runtime Error的几种情况
- stack与queue用法及它们的几层含义
- vshield manager的一些笔记
- jQuery经典面试题及答案精选
- What's wrong with 8051
- Ubuntu 14.04 开启启动器图标最小化功能
- bluedroid移植(串口流控)
- 【字符串处理系列】最长不重复子串