Copy相关

怎么用copy关键字?

1、NSString、NSArray,NSDictionary等经常使用copy关键字,是因为它们有可变类型

2、block也经常使用,因为在MRC中,方法内部的block是在栈区的,使用copy可以把它放在堆区,在ARC中写不写都行,对block使用strong和copy都是一样的,但是使用copy更好。

 

深拷贝和浅拷贝

浅拷贝就是拷贝指针,深拷贝是拷贝内容

集合的浅拷贝

     进行浅拷贝,会向原始的集合发送retain消息,引用计数+1,所以copy后的指针的地址等于原来的那个集合的地址

集合的深拷贝

     只是单层的深拷贝,内部的元素还是指针拷贝      

不论是对集合还是非集合都适用

  • [immutableObject copy] // 浅复制
  • [immutableObject mutableCopy] //深复制
  • [mutableObject copy] //深复制
  • [mutableObject mutableCopy] //深复制

集合的深拷贝

两种方法:

1、用 initWithArray:copyItems: 将第二个参数设置为YES即可深复制

NSDictionary shallowCopyDict = [[NSDictionary alloc] initWithDictionary:someDictionary copyItems:YES];

用这种方法深复制,集合里的每个对象都会收到 copyWithZone: 消息。如果集合里的对象遵循 NSCopying 协议,那么对象就会被深复制到新的集合。如果对象没有遵循 NSCopying 协议,而尝试用这种方法进行深复制,会在运行时出错。copyWithZone: 这种拷贝方式只能够提供一层内存拷贝(one-level-deep copy),而非真正的深复制。

2、将集合进行归档(archive),然后解档(unarchive),真正意义的深复制

NSArray *trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:oldArray]];

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值