当前位置:网站首页>OC-拷贝
OC-拷贝
2022-08-04 21:37:00 【彭同学她同桌】
深拷贝
地址会发生改变
NSString* s1 = [NSString stringWithFormat:@"abcd"];
NSString* s2 = [s1 mutableCopy];//此时s2地址变了 但是s2依旧时不可变对象
NSMutableString *s3 = [s1 mutableCopy];//这样就可以
[s3 appendString:@"" ]
浅拷贝 指针拷贝
地址不会发生改变
NSString* s2 = [s1 copy];//地址是不会变的
NSString* s1 = [NSString stringWithFormat:@"abcd"];
NSString* s2 = [s1 copy];
NSLog(@"%p,%p",s1,s2);//会发现地址一样
如果想要调用copy就需要实现copyWithZone并且使用NSCopying协议(这个协议里面有copyWithZone)
自定义copy
@interface B:NSObject<NSCopying>
@property (copy)NSString *name;
@end
@implementation B
-(id)copyWithZone:(NSZone *)zone//这样重写后在A类中就能实现b变量的深拷贝
{
B* temp = [[B alloc]init];
temp.name = _name;
return temp;
}
@end
@interface A:NSObject<NSCopying>
@property (copy)NSString *name;//深拷贝 通过这个可以决定这个变量是深拷贝还是浅拷贝
/* 如果是copy 则setName的实现是 -(void)setName:(NSString*)name { _name = [name copy];//此时无论是可变(NSMutableString)还是不可变(NSString)copy得到的都是不可变对象 } */
@property (strong)NSString *name1;//浅拷贝
@property (nonatomic,strong)B*b;//如果重写了b的copyWithZone 则可以实现深拷贝
@end
@implementation A
-(id)copyWithZone:(NSZone *)zone
{
NSLog(@"执行了copyWithZone");
A *temp = [[A alloc]init];
temp.name = _name;//此时是浅拷贝 地址不会发生改变相当于执行[_name copy]
temp.name1 = _name1; //同样地址不会变 并且在外面改变temp.name1 也会对_name1座更改
temp.b = [_b copy];//这里copy实现深拷贝 temp.b和_b的地址就不一样了
return temp;
}
不可变对象执行copy生成的还是不可变对象 指针拷贝 浅拷贝
不可变对象执行mutableCopy 生成了可变对象 内容拷贝 深拷贝
可变对象执行copy 生成不可变对象 但是时深拷贝 地址会改变
可变对象执行mutableCopy 生成可变对象 深拷贝 地址会改变
边栏推荐
猜你喜欢
Android 面试——如何写一个又好又快的日志库?
数电快速入门(一)(BCD码和三种基本逻辑运算的介绍)
如何根据“前序遍历,中序遍历”,“中序遍历,后序遍历”构建按二叉树
【CC3200AI 实验教程 1】疯壳·AI语音人脸识别(会议记录仪/人脸打卡机)-开发环境搭建
ue unreal 虚幻 高分辨率无缩放 编辑器字太小 调整编辑器整体缩放
Spss-一元回归实操
[QT] Implementation of callback function
ROS packages visualization
七夕特制:《牛郎会织女》
AXI interface application of Zynq Fpga image processing - the use of axi_lite interface
随机推荐
Dotnet using WMI software acquisition system installation
用Tesseract开发一个你自己的文字识别应用
Hands-on Deep Learning_NiN
LayaBox---knowledge point
Some problems with passing parameters of meta and params in routing (can be passed but not passed, empty, collocation, click to pass multiple parameters to report an error)
实战:10 种实现延迟任务的方法,附代码!
Named routes, the role of name in components
七夕特制:《牛郎会织女》
ROS packages visualization
DSPE-PEG-Aldehyde,DSPE-PEG-CHO,磷脂-聚乙二醇-醛基一种疏水18碳磷脂
Win11如何设置软件快捷方式?
PowerCLi 批量配置NTP
matlab drawing
milvus配置相关
win10 uwp use WinDbg to debug
EasyGBS接入最新版海康摄像头后无法传递告警信息该如何解决?
打卡第 2 天: urllib简记
Altium Designer 19.1.18 - 保护锁定的对象
【ubuntu20.04安装MySQL以及MySQL-workbench可视化工具】
DGL安装教程