iOS 开发之对象Copy

先写一下理论,然后写具体的实现。

复制对象:将一个已有的对象复制一份出来,开辟一块新的内存(堆内存)来存储对象,相当于一个对象副本,就像复制文件一样。源对象和对象副本是两块不同的内存区域。对象复制又分为浅拷贝和深拷贝。

Foundation框架支持复制对象的有:NSString,NSMutableString,NSArray,NSMutableArray,NSDictionary,NSMutableDictionary,

NSNumber。也可以自定义对象来支持复制,前提是必须遵守NSCopying协议,或是NSMutableCopying协议,或是两者都必须遵守。


copy方法用于复制对象的不可变副本。通常来说,copy方法总是返回对象的不可修改的副本,即使该对象本身是可修改的。例如:程序调用了NSMutableString的copy方法,将会返回不可修改的字符串对象。


mutableCopy方法用于复制对象的可变副本。通常来说,mutableCopy方法总是返回对象的可修改的副本,即使该对象本身是不可修改的。例如:程序调用了NSString的mutableCopy方法,将会返回可修改的字符串对象。

提到copy就必须说一下retain,retain是指针拷贝,而copy是对象拷贝。


retain只是引用计数+1,两个指针指向同一个内存。

copy是开辟出一个内存,两个指针指向两块内存。


浅拷贝:只拷贝对象本身,对象里面所包含的属性或者对象不进行拷贝。

深拷贝:除了拷贝对象本身之外,对象里面所包含的属性或对象都一起拷贝,直到两个对象没有任何的共用部分。


// 下面用代码实现一下自定义对象的copy

#import <Foundation/Foundation.h>


@interface CopyDto :NSObject <NSCopying>


@property (nonatomic,copy) NSString *name;

@property (nonatomic,copy) NSString *age;


@end




#import "CopyDto.h"


@implementation CopyDto


- (id)copyWithZone:(NSZone *)zone {


    CopyDto *dto = [[[selfclass]allocWithZone:zone]init];

    dto.name =self.name;

    dto.age =self.age;


    return dto;

}


@end


CopyDto *dto1 = [CopyDto alloc] init];

dto1.name = @"笨笨";

dto1.age = @"12";


CopyDto *dto2 = [dto1 copy];

这样就完成了一次自定义对象的copy。 dto1和dto2内存不同,这是属于深拷贝,两个对象没有任何的公共部分,改变dto2的值,dto1不会跟着改变。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值