OC copy和mutableCopy

本文深入探讨了浅拷贝与深拷贝的概念,解释了两者在处理不可变对象与可变对象时的区别。详细说明了copy与mutableCopy方法的应用场景,以及在Objective-C中如何正确使用copy属性修饰符。

基本概念

浅拷贝:地址拷贝,两个对象指向同一地址。
深拷贝:对象拷贝,两个对象指向不同地址。

copy & mutableCopy

copymutableCopy
不可变对象浅拷贝 不可变深拷贝 可变
可变对象深拷贝 不可变深拷贝 可变

总结:

  1. 用copy后都是不可变的,用mutableCopy后都是可变的。
  2. 用mutableCopy都是深拷贝。
  3. 区别: 不可变对象copy是浅拷贝,可变对象copy后是深拷贝。

Property用copy修饰

Property用copy修饰是一次深拷贝

不可变用copy修饰,相当于做一次备份,不会在其或子类中被修改。
可变对象一般不推荐copy修饰,copy后会变成不可变,使用可变方法会抛异常。

在 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值