iOS学习

ios中的copy

2017-06-23  本文已影响42人  快乐的tomato

为什么要专门写一篇文章来讲这copy?以前在开发的时候只知道什么时候用,但是在面试的时候,会经常被问到,一研究,发现这里面的东西还是很多的。

一、copy的概念及入门

1.1 what
Copy的字面意思就是“复制”,是一个产生副本的过程。
对象copy的目的:要使用某个对象的数据,但是在修改对象的时候不影响原来的对象内容。
1.2 特点
修改原文件的内容,不会影响副本文件
修改副本文件的内容,不会影响原文件
OC中的copy.就是指的对象的拷贝
1.3 如何使用copy
一个对象可以调用copy或mutableCopy方法来创建一个副本对象。

copy:创建的是不可变副本(nsstring、nsArray等)
mutableCopy:创建的是可变的副本(nsmutableString等等)
以NSString为例:

NSString *str = @"abc";//str的地址是add1
NSString *str2 = [str copy];//str2的地址是add1


NSMutableString *str3 = [str mutableCopy];//str3的地址是add2
[str3 appendString:@"XXX"];//打印出abcXXX

NSMutableString *str4 = [NSMutableString string];
[str4  appendString:@"张三"];
NSMutableString *str5 = [str4 copy];//
[str5  appendString:@"张三"];//运行到这里报错,可变对象copy之后不可变

copy 就是浅复制,因为没有产生新的对象,只是对地址的拷贝
mutableCopy 就是深复制,会在内存中重新分配一块内存空间

二、property中copy的作用

person类中有一个name的属性
如果用retain或strong修饰
@property (nonatomic,retain) NSString *name

现在定义一个NSMutableString,
NSMutableString *str = [NSMutableString string];
[str appendString:@"李四"];
p.name = str;//打印出李四

[str appendString:@"哈哈哈"];
打印p.name //打印出李四哈哈哈,name变了

如果用copy修饰,打印出的都是李四。

三、property内存管理策略

copy:只用于NSString/block
block为什么使用copy

四、为自定义的类实现copy操作

新建一个person类,实现copy操作
1、让person类遵守Copying协议
2、实现copyWithZone方法,在该方法中返回一个对象的副本即可。
3、在copyWithZone方法中,创建一个新的对象,并设置该对象的数据与现有对象一致,并返回该对象。


Dog.png main.png

iOS中关键字copy与mutableCopy的详解,看我你就都懂了

四、数组的copy

1、不管是NSArray还是NSMutableArray,使用copy产生的都是不可变的
2、不管是NSArray还是NSMutableArray,使用MutableCopy产生的都是可变的
3、NSArray使用copy不会产生新的对象,其他都会产生新的对象

上一篇 下一篇

猜你喜欢

热点阅读