objective-c中对象复制的几种情况

objective-c中有NSCopying和NSMutableCopying两种协议,分别定义了copy和mutableCopy两个方法。
如果某个类要实现这两种对象拷贝,必须实现上述两个协议。

首先我们要搞清楚copy和mutalbeCopy的区别。
众所周知,objective-c中,有NSString和NSMutableString,NSArray和NSMutableArray等等配对的类。
其中前者是不可变的类(没有set,add,append等方法),后者是可变的类(有set,add,append等方法)。
copy和mutableCopy的区别在于它们的返回值是不可变类型还是可变类型。
不管被复制的对象是不可变的还是可变的,copy的返回值类型始终是不可变类型。
同样,不管被复制的对象是不可变的还是可变的,mutableCopy的返回值类型始终是可变类型的。
比如,
NSArray *array = [[NSArray alloc] init];
id arr1 = [array copy]; // arr1是NSArray类型
id arr2 = [array mutableCopy]; // arr2是NSMutableArray类型
再比如,
NSMutableArray *array = [[NSMutableArray alloc] init];
id arr1 = [array copy]; // arr1是NSArray类型
id arr2 = [array mutableCopy]; // arr2是NSMutableArray类型

另外还有个深复制和浅复制的问题,
一般的复制都是浅复制,也就是只复制对象类本身,该类所参照的对象不复制。
但是不可变类的copy函数,其实并没有复制,而只是把指针复制了一下,我们把它称为指针复制。
比如,
NSArray *array = [[NSArray alloc] init];
id arrCopy = [array copy];
此时,arrCopy和array指向同一个内存空间,用arrCopy==array作判断条件是成立的。
且此时arrCopy和array的retainCount是2,说明该复制只是把retainCount+1,并没有真正复制内存。
这样做其实是有道理的,因为NSArray是不可变的,即使不真正复制内存,也不影响其当做复制的来正常使用。
但NSArray的mutableCopy、NSMutableArray的copy和mutableCopy是真正的复制内存,而且是浅复制。
其它可变类型和不可变类型的copy和mutableCopy也遵循同样的规则。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值