OC中的copy和mutableCopy

本文详细介绍了Objective-C中对象拷贝的深拷贝和浅拷贝概念,通过实例展示了可变对象与不可变对象在copy和mutableCopy操作下的内存分配和行为差异。对于可变对象,无论是copy还是mutableCopy都是深拷贝;而对于不可变对象,copy为浅拷贝,mutableCopy为深拷贝。理解这些拷贝机制对于iOS开发至关重要。
摘要由CSDN通过智能技术生成

在OC中,对对象的拷贝可分为深拷贝和浅拷贝。

深拷贝,会生成新的指针和新的内存,新的指针指向新开辟的内存空间,并且会将原来的内存中的内容也拷贝过来。

浅拷贝,会生成新的指针,但是不会开辟新的内存空间,也不会拷贝原来内存中的内容。新生成的指针会指向之前的内存地址。

画个图来说明:

请添加图片描述
请添加图片描述

OC中,对对象的拷贝需看改对象本身是否是可变的。

对于可变对象的拷贝:

    NSMutableArray *muArr = [[NSMutableArray alloc] init];
    [muArr addObject:@"Value1"];
    [muArr addObject:@"Value2"];
    [muArr addObject:@"Value3"];
    NSLog(@"%@ %p %p",muArr, muArr, &muArr);

    NSArray *arr1 = [muArr copy];
    NSLog(@"%@ %p %p",arr1, arr1, &arr1);

    NSMutableArray *arr2 = [muArr mutableCopy];
    NSLog(@"%@ %p %p",arr2, arr2, &arr2);
    
    [arr2 addObject:@"Jerry"];


    NSLog(@"%@ %p %p",muArr, muArr, &muArr);
    NSLog(@"%@ %p %p",arr1, arr1, &arr1);
    NSLog(@"%@ %p %p",arr2, arr2, &arr2);
  • 对可变对象使用copy或者mutableCopy,都是深拷贝,会生成新的指针对象,并开辟新的内存空间。

对于不可变对象拷贝:

    NSArray *arr = @[@"Value1",@"Value2",@"Value3"];
    NSLog(@"%@ %p %p",arr, arr, &arr);

    NSArray *arr1 = [arr copy];
    NSLog(@"%@ %p %p",arr1, arr1, &arr1);

    NSMutableArray *arr2 = [arr mutableCopy];
    NSLog(@"%@ %p %p",arr2, arr2, &arr2);

    [arr2 addObject:@"Tom"];
    
    NSLog(@"%@ %p %p",arr, arr, &arr);
    NSLog(@"%@ %p %p",arr1, arr1, &arr1);
    NSLog(@"%@ %p %p",arr2, arr2, &arr2);
  • 对不可变对象使用copy,会生成新的指针对象,但是不会开辟新的内存空间,是浅拷贝。
  • 对不可变对象使用mutableCopy,也会生成新的指针对象,而且会开辟新的内存空间,是深拷贝。

用一个图来总结:

请添加图片描述
一句话来总结就是:

在OC中,对可变对象的Copy或者mutableCopy都是深拷贝。对不可变对象使用Cpoy是浅拷贝,使用mutableCopy是深拷贝

在 Objective-C 深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是用于复制对象的两种不同方式。 浅拷贝是指创建一个新的对象,该对象与原始对象共享数据的内存地址。换句话说,新对象只是原始对象的一个引用,对新对象的修改也会影响原始对象。在 Objective-C ,可以使用 `copy` 方法来执行浅拷贝深拷贝是指创建一个新的对象,并且复制原始对象的所有数据。这意味着新对象有自己的内存地址,对新对象的修改不会影响原始对象。在 Objective-C ,可以使用 `mutableCopy` 方法来执行深拷贝。 需要注意的是,深拷贝只会复制对象本身,而不会递归地复制对象所包含的其他对象。如果需要对对象的所有数据进行递归复制,可以通过实现 NSCopying 协议来自定义深拷贝操作。 下面是一个示例代码,演示了如何执行浅拷贝深拷贝: ```objective-c #import <Foundation/Foundation.h> @interface Person : NSObject <NSCopying> @property (nonatomic, copy) NSString *name; @end @implementation Person - (instancetype)copyWithZone:(NSZone *)zone { Person *copy = [[Person allocWithZone:zone] init]; copy.name = self.name; return copy; } @end int main(int argc, const char * argv[]) { @autoreleasepool { Person *person1 = [[Person alloc] init]; person1.name = @"John"; // 浅拷贝 Person *person2 = [person1 copy]; NSLog(@"person1: %@, person2: %@", person1.name, person2.name); // 输出:person1: John, person2: John // 深拷贝 Person *person3 = [person1 mutableCopy]; person3.name = @"Emily"; NSLog(@"person1: %@, person3: %@", person1.name, person3.name); // 输出:person1: John, person3: Emily } return 0; } ``` 在上面的示例,使用 `copy` 方法执行了浅拷贝操作,`mutableCopy` 方法执行了深拷贝操作。注意,为了实现深拷贝,我们在 `Person` 类遵循了 NSCopying 协议,并重写了 `copyWithZone:` 方法来自定义深拷贝操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Morris_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值