IOS NSCopying

首 先,从copy开始说,简而言之,copy的目的就是生成一个新的实例,然后把其成员都按原实例赋值。对于非指针型的成员,比如BOOL, int, float,这样的赋值可以直接进行。但是对于指针型的数据,比如Objc中用到的对象,就有Deep Copy和Shallow Copy的区别——这个和在C++中的基本上是一样的:是生成新的成员对象,或是指向同一成员对象。了 解了这点以后,再看看Copy在Objetive-C中的实现方式。如果要调用一个对象的copy方法,这个对象必须遵循NSCopying的协议。这个 协议中规定了一个方法:- (id)copyWithZone:(NSZone *)zone;我们就是通过实现这个方法给对象提供拷贝的功能。对于很多现有类,如NSString,NSDictionary,。。。这个方法已经实 现。假设我们现在自定义了一个类,需要为这个类提供拷贝的功能,就需要自己来动手写CopyWithZone的方法:示例如下:

@interface Product()<NSCopying>
@property(nonatomic,weak)id<NSCopying>delegate;
@end
@implementation Product
-(instancetype)initWithName:(NSString*)name Address:(NSString*)address{
    if (self = [super init]) {
        self.name = name;
        self.Address = address;
    }
    return self;
}
-(id)copyWithZone:(NSZone *)zone{
    Product *product = [[Product alloc]initWithName:self.name Address:self.Address];
    [product setDelegate:[self delegate]];
    return product;
}

使用

Product *p1 = [[Product alloc]initWithName:@"BOB" Address:@"beijin"];
    Product *p2 = [p1 copy];
    NSLog(@"p1.add=%p,%@,p2.add=%p,%@",p1,p1.name,p2,p2.name);

打印出来的对象地址是不同的,但是内容是一样的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值