Copy和MUTableCopy

Copy和MUTableCopy


在这之前先了解几个基本概念:
浅复制:指针复制(所谓指针复制,指两个指针指向同一块内存),并没有进行对象复制
单层深复制:对于集合类所说的,指的是只复制了该集合类的最外层,里面的元素没有复制(即两个集合类的地址不一样,但是两个集合里所存储的元素的地址是一样的)
完全复制:指的是完全复制整个集合类,也就是说两个集合地址不一样,里面所存储的元素地址也不一样


非集合类(NSString之类)
[immutableObject copy]  //浅复制  
[immutableObject mutableCopy] //深复制
[mutableObject copy] //深复制
[mutableObject mutableCopy] //深复制

结论:不可变进行copy是浅复制,mutableCopy是深复制。可变:copy和mutableCopy都是深复制
集合类(NSArray之类)
[immutableObject copy]  //浅复制
[immutableObject mutableCopy] //单层深复制
[mutableObject copy] //单层深复制
[mutableObject mutableCopy] //单层深复制

结论:不可变copy是浅复制,mutableCopy是单层深复制。可变:copy和mutableCopy都是单层深复制
那么,如何实现多层深复制呢?
NSArray *copyArray = [[NSArray alloc] initWithArray:array copyItems:YES];  // 完全复制
需要注意的是:
以上所说的两种情况默认都实现了NSCopying和NSMutableCopying协议,对于自定义继承NSObject的类,需要实现以下方法,否则copy会导致crash
        copy需要实现NSCopying协议,然后实现以下方法,否则copy会crash-(id)copyWithZone:(NSZone *)zone {
    ·      CopyObject  *copy = [[[self class] alloc] init];
    ·      copy.name = self.name;
    ·      copy.mobile = self.mobile;
    ·      copy.company = self.company;
    ·      copy.descInfo = self.descInfo;
    ·      return copy;
    ·   }
        mutableCopy时,需要实现NSMutableCopying协议,否则mutableCopy会crash-(id)mutableCopyWithZone:(NSZone *)zone {
    ·      MutableCopyObject  *mutableCopy = [[[self class] alloc] init];
    ·      mutableCopy.name = self.name;
    ·      mutableCopy.mobile = self.mobile;
    ·      mutableCopy.company = self.company;
    ·      mutableCopy.descInfo = self.descInfo;
    ·      return mutableCopy;
    ·   }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 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、付费专栏及课程。

余额充值