iOS深复制和浅复制

浅复制示例代码:

    NSMutableArray *mArray = [NSMutableArray arrayWithObjects:
                              [NSMutableString stringWithString: @"origionA"],
                              [NSMutableString stringWithString: @"origionB"],
                              [NSMutableString stringWithString: @"origionC"], nil];
    
    NSMutableArray *mArrayCopy = [mArray mutableCopy];
    
    NSMutableString *string = [mArray objectAtIndex:0];
    
    [string appendString:@"Append"];
    
    [mArrayCopy removeObjectAtIndex:1];
    
    NSLog(@"object.name = %@",mArray);
    NSLog(@"object.name = %@",mArrayCopy);

打印结果:

2015-04-23 15:18:15.151 AppTest[14507:122304] object.name = (
    origionAAppend,
    origionB,
    origionC
)
2015-04-23 15:18:15.151 AppTest[14507:122304] object.name = (
    origionAAppend,
    origionC
)


说明:

Foundation类实现了名为copy和mutableCopy的方法,可以使用这些方法创建对象的副本,通过实现一个符合<NSCopying>协议(如下代码)的方法来完成这个工作,如果必须区分要产生的对象是可变副本还是不可变副本,那么通过<NSCopying>协议来产生不可变副本,通过<NSMutableCopying>协议来产生可变副本。

然而Foundation类的copy和mutableCopy方法,默认情况下只是对对象创建的一个新的引用,他们都指向同一块内存,也就是浅复制。因此就会出现上面的结果。

@protocol NSCopying

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

@end

@protocol NSMutableCopying

- (id)mutableCopyWithZone:(NSZone *)zone;

@end

深复制示例代码:

@interface DemoObject : NSObject<NSCopying>

@property (strong, nonatomic) NSMutableString *name;

@end

@implementation DemoObject

- (id)copyWithZone:(NSZone *)zone
{
    
    DemoObject* object = [[[self class] allocWithZone:zone]init];
    
    return object;
    
}

- (id)init
{
    self = [super init];
    if (self)
    {
        self.name = [NSMutableString stringWithString: @"name"];
    }
    
    return self;
}

@end

 DemoObject* demoObject = [[DemoObject alloc]init];
 [demoObject.name appendString:@"Append"];
    
 DemoObject* newDemoObject = [demoObject copy];
 [newDemoObject.name appendString:@"NewAppend"];
    
 NSLog(@"demoObject.name = %@",demoObject.name);
 NSLog(@"newDemoObject.name = %@",newDemoObject.name);


打印结果:

demoObject.name = nameAppend

newDemoObject.name = nameNewAppend


说明:

自定义类中,必须实现<NSCopying>或者<NSMutableCopying>协议并实现copyWithZone:或者mutableCopyWithZone:方法,才能响应copy和mutableCopy方法来复制对象。

参数zone与不同的存储区有关,你可以在程序中分配并使用这些存储区,只有在编写要分配大量内存的应用程序并且想要通过将空间分配分组到这些存储区中来优化内存分配时,才需要处理这些zone。可以使用传递给copyWithZone:的值,并将它传给名为allocWithZone:的内存分配方法。这个方法在指定存储区中分配内存。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值