当前位置:网站首页>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 生成可变对象 深拷贝 地址会改变
边栏推荐
- LayaBox---TypeScript---Problems encountered at first contact
- UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xd6 in position 120: invalid continuation byte
- SPSS-System Clustering Hand Calculation Practice
- In action: 10 ways to implement delayed tasks, with code!
- PMP证书在哪些行业有用?
- Red team kill-free development practice of simulated confrontation
- 数电快速入门(四)(组合逻辑电路的分析以及设计的介绍)
- Altium Designer 19.1.18 - 保护锁定的对象
- Arduino 电机测速
- boostrap多选PID查找端口 window
猜你喜欢
MySQL查询为啥慢了?
AXI interface application of Zynq Fpga image processing - the use of axi_lite interface
数电快速入门(五)(编码器的介绍以及通用编码器74LS148和74LS147的介绍)
OD-Model [6]: YOLOv2
STM32MP157A驱动开发 | 01- 板载LED作为系统心跳指示灯
In which industries is the PMP certificate useful?
PRIMAL: Pathfinding via Reinforcement and Imitation Multi-Agent Learning Code Analysis
docker 部署redis集群
七夕特制:《牛郎会织女》
中大型商业银行堡垒机升级改造方案!必看!
随机推荐
ue unreal 虚幻 高分辨率无缩放 编辑器字太小 调整编辑器整体缩放
Exploration and Practice of Database Governance
[larave]关于laravel使用form submit()不能获取值问题
1.读写点云文件
PowerCLi 批量配置NTP
Altium Designer 19.1.18 - 保护锁定的对象
搬走地下空间开发利用“绊脚石” 中地数码取得地下空间透明化技术突破
Win11如何设置软件快捷方式?
数电快速入门(三)(卡诺图化简法的介绍)
mysql基础
LayaBox---TypeScript---structure
2022年江苏省大学生电子设计竞赛(TI杯)B题 飞机 省级一等奖记录 “一个摆烂人的独白”
立即升级!WPS Office 出现 0day 高危安全漏洞:可完全接管系统,官方推出紧急更新
MySQL查询为啥慢了?
七夕特制:《牛郎会织女》
JWT actively checks whether the Token has expired
大势所趋之下的nft拍卖,未来艺术品的新赋能
openresty lua-resty-template页面静态化
用Tesseract开发一个你自己的文字识别应用
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)