OC中的深拷贝和浅拷贝
时间: 2023-11-02 08:06:48 浏览: 48
在 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:` 方法来自定义深拷贝操作。