【OC】对于深浅拷贝的理解和总结

前言

  经过将近四周的学习,小组内对这四个星期的OC学习情况进行了考核,我发现自己对各种对象的深浅拷贝还存在一些问题,本篇博客是我对自己对深浅拷贝的理解和总结。

深浅拷贝的概念

  在Objective-C中对象之间的拷贝分为浅拷贝和深拷贝。
  浅拷贝不复制对象本身或对象内容,而仅仅复制对象引用的地址,因此,原始对象和副本将引用同一个内存地址,这意味着对任意一个对象所做的更改都会影响到另一个;
  深拷贝会复制对象以及对象中包含的所有内容,副本将是原始对象的一个完整副本,包括所有的数据。在OC中,可以通过 copy 方法来实现深拷贝,但前提是对象是可变的。如果对象是不可变的,copy 通常只做浅拷贝。

ps:非容器类指如NSString,NSNumber等包装类;容器类是指如NSArray、NSSet、NSDictionary等的容器包装类。

非容器类

  对非容器类浅拷贝就是拷贝对象的地址,对象里面存的内容仍然只有一份,没有新的内存被分配,两个对象仍存在共用的部分,;深拷贝就是重新分配一块内存,把另一个对象的内容全部复制一份,存入新的对象里,两个对象没有任何共用的部分。

下面是对非容器类拷贝的代码演示:

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
//                    容器类
        NSString* string11 = @"spyFamily";
        NSString* string12 = [string11 copy];
        NSString* string13 = [string11 mutableCopy];
        NSMutableString* string14 = [string11 copy];
        NSMutableString* string15 = [string11 mutableCopy];
        NSLog(@"string11的地址为%p", string11);
        NSLog(@"string12的地址为%p", string12);
        NSLog(@"string13的地址为%p", string13);
        NSLog(@"string14的地址为%p", string14);
        NSLog(@"string15的地址为%p", string15);

        NSMutableString* string21 = [NSMutableString stringWithString:@"间谍过家家"];
        NSString* string22 = [string21 copy];
        NSString* string23 = [string21 mutableCopy];
        NSMutableString* string24 = [string21 copy];
        NSMutableString* string25 = [string21 mutableCopy];
        NSLog(@"string21的地址为%p", string21);
        NSLog(@"string22的地址为%p", string22);
        NSLog(@"string23的地址为%p", string23);
        NSLog(@"string24的地址为%p", string24);
        NSLog(@"string25的地址为%p", string25);
    }
    return 0;
}

运行结果:

在这里插入图片描述

容器类

  对容器类浅拷贝是对容器里的内容不进行拷贝,两个容器里的所装的东西是一样的,在一个容器中进行修改,则另一个容器中的内容也会变化;深拷贝是对容器中的每个元素都进行拷贝。

对于容器类的代码演示如下:

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSArray* array = [NSArray arrayWithObjects:@"黄昏", @"约尔", @"阿尼亚", nil];
        NSArray* copyArray1 = [array copy];
        NSMutableArray* mutableCopyArray1 = [array mutableCopy];
        NSLog(@"array的地址为%p", array);
        NSLog(@"copyArray1地址为%p", copyArray1);
        NSLog(@"mutableCopyArray1地址为%p", mutableCopyArray1);

        NSLog(@"array[0]地址为%p", array[0]);
        NSLog(@"copyArray1[0]地址为%p", copyArray1[0]);
        NSLog(@"mutableCopyArray1[0]地址为%p", mutableCopyArray1[0]);
        
        NSMutableArray* mutableArray = [NSMutableArray arrayWithObjects:@"黄昏",@"约尔",@"阿尼亚", nil];
        NSArray* copyArray2 = [mutableArray copy];
        NSMutableArray* mutableCopyArray2 = [mutableArray mutableCopy];

        NSLog(@"mutableArray地址为%p", mutableArray);
        NSLog(@"copyArray2地址为%p", copyArray2);
        NSLog(@"mutableCopyArray2地址为%p", mutableCopyArray2);

总结

被拷贝的对象类型拷贝方法深/浅拷贝
非容器类的不可变对象copy浅拷贝
非容器类的不可变对象mutableCopy深拷贝
非容器类的可变对象copy深拷贝
非容器类的可变对象mutableCopy深拷贝
容器类的不可变对象copy浅拷贝
容器类的不可变对象mutableCopy深拷贝
容器类的可变对象copy深拷贝
容器类的可变对象mutableCopy深拷贝
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值