您现在的位置是:主页 > news > 上海智能网站建设设计/百度搜索开放平台
上海智能网站建设设计/百度搜索开放平台
admin2025/5/3 9:06:46【news】
简介上海智能网站建设设计,百度搜索开放平台,教人做甜点的网站,网站开发维护前景一、概念 浅拷贝:指针拷贝,不产生新的对象,源对象的引用计数器1; 深拷贝:对象拷贝,会产生新的对象,源对象的引用计数器不变; tip:浅拷贝好比你和你的影子,你完蛋,你的影子也完蛋。…
一、概念
浅拷贝:指针拷贝,不产生新的对象,源对象的引用计数器+1;
深拷贝:对象拷贝,会产生新的对象,源对象的引用计数器不变;
tip:浅拷贝好比你和你的影子,你完蛋,你的影子也完蛋。深拷贝好比你和你的克隆人,你完蛋,你的克隆人还活着。
二、如何令自己所写的对象具有拷贝功能?
1、如果想让自己的类具备copy
方法,并返回不可边类型,必须遵循NSCopying协议,并且实现 - (id)copyWithZone:(NSZone *)zone
2、如果让自己的类具备mutableCopy
方法,并且放回可变类型,必须遵守NSMutableCopying,并实现
- (id)mutableCopyWithZone:(nullable NSZone *)zone
三、copy 、mutableCopy
- (id)copy;
- (id)mutableCopy;
1、例:NSString
NSString *str=@"123";NSString *strCopy=[str copy]; //浅拷贝(指针拷贝)NSMutableString *mutableStr=[str mutableCopy]; //深拷贝 ,和产生了新对象NSLog(@" str=%p",str);NSLog(@"strCopy =%p",strCopy);NSLog(@"mutableStr=%p",mutableStr);2019-04-18 21:10:49.958063+0800 不不要的[1303:131565] str=0x10fafe068
2019-04-18 21:10:49.958268+0800 不不要的[1303:131565] strCopy =0x10fafe068
2019-04-18 21:10:49.958389+0800 不不要的[1303:131565] mutableStr=0x6000017a2b50
可以看出NSString对象:1、copy不会生产新的内存地址,浅拷贝 2、mutableCopy 产生新的内存地址,是深拷贝。
2、例:NSMutableString
NSMutableString *str=[[NSMutableString alloc]initWithString:@"1234"];NSString *strCopy=[str copy];//深拷贝NSMutableString *mutableStr=[str mutableCopy];//深拷贝NSLog(@" str=%p",str);NSLog(@"strCopy =%p",strCopy);NSLog(@"mutableStr=%p",mutableStr);
2019-04-18 21:17:24.747090+0800 不不要的[1367:151996] str=0x6000027cd260
2019-04-18 21:17:24.747294+0800 不不要的[1367:151996] strCopy =0xe61aa012c240f537
2019-04-18 21:17:24.747431+0800 不不要的[1367:151996] mutableStr=0x6000027cd710
可以看出NSMutableString对象:copy 和mutableCopy 都产生新的内存 都是深拷贝
四、NSString为什么要用copy关键字,如果用strong会有什么问题?(注意:这里没有说用strong就一定不行。使用copy和strong是看情况而定的
众所周知,我们知道,可变类型(NSMutableArray,NSMutableString等)是不可边类型(NSString,NSArray等)的子类,因为多态的原因,我们可以使用不可边类型去接受可变类型。
1.当我们使用strong修饰A不可边类型的时候,并且使用B可变类型给A赋值,再去修改可变类型B值的时候,A所指向的值也会发生改变。strong只是让创建的对象引用计数器+1,并返回当前对象的内容地址,当我们修改B指向的内容的时候,A指向的内容也同样发生了改变,因为他们指向的内存地址是相同的,是一份内容。
2.当我们使用copy修饰A不可边类型的时候,并且使用B可变类型给A赋值,再去修改可变类型B值的时候,A所指向的值不会发生改变。因为当时用copy的修饰的时候,会拷贝一份内容出来,并且返回指针给A,当我们修改B指向的内容的时候,A指向的内容是没有发生改变的。因为A指向的内存地址和B指向的内存地址是不相同的,是两份内容
3.copy修饰不可边类型(NSString,NSArray等)的时候,且使用不可边类型进行赋值,表示浅拷贝,只拷贝一份指针,和strong修饰一样,当修饰的是可变类型(NSMutableArray,NSMutableString等)的时候,且使用可边类型进行赋值,表示深拷贝,直接拷贝新一份内容,到内存中。表示两份内容。
五、这个写法会出什么问题:@property (nonatomic, copy) NSMutableArray *arr;
问题:添加,删除,修改数组内的元素的时候,程序会因为找不到对应的方法而崩溃。
//如:-[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent to instance 0x7fcd1bc30460
// copy后返回的是不可变对象(即 arr 是 NSArray 类型,NSArray 类型对象不能调用 NSMutableArray 类型对象的方法)
原因:是因为 copy 就是复制一个不可变 NSArray 的对象,不能对 NSArray 对象进行添加/修改。