iOS知识总结(五):深、浅拷贝

定义:

  • 浅拷贝:并不拷贝对象本身,仅仅是拷贝指向对象的指针
  • 深拷贝:直接拷贝整个对象内容到另一块内存中
    再简单些说:浅拷贝就是指针拷贝;深拷贝就是内容拷贝。

copy和mutbleCopy的区分:

在非集合类的对象中(例如NSString):

[string copy] // 浅拷贝
[string mutableCopy] //深拷贝
[mutableString copy] //深拷贝
[mutableString mutableCopy] //深拷贝

在集合类的对象中(例如NSArray):

[array copy] // 浅拷贝
[array mutableCopy] //单层深拷贝
[mutableArray copy] //单层深拷贝
[mutableArray mutableCopy] //单层深拷贝

这里的单层深拷贝(one-level-deep copy)是指集合对象中可能会包含指针类型的实例变量,所以值拷贝了Array,而其中的元素知识浅拷贝。

自定义对象的拷贝

在OC中不是所有的类都支持拷贝,只有遵循<NSCopying>才支持copy,只有遵循<NSMutableCopying>才支持mutableCopy。如果没有遵循,拷贝时会直接Crash。

例如自定义一个Person的类:

@interface Person : NSObject<NSCopying>

@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger age;

@end

要想实现对person的拷贝即:

//自定义对象的复制
- (void)testPerson {
    Person *person1 = [[Person alloc] init];
    person1.age = 20;
    person1.name = @"小李";
    
    Person *person2 = [person1 copy];
    
    NSLog(@"person1_p: %p", person1);
    NSLog(@"person2_p: %p", person2);
}

则在person中必须实现copyWithZone的方法,即:

- (nonnull id)copyWithZone:(nullable NSZone *)zone {
    Person *person = [[[self class] allocWithZone:zone] init];
    person.name = self.name;
    person.age = self.age;
    return person;
}

否则程序会崩溃,同理NSMutableCopy也是如此。

参考文章:
https://www.jianshu.com/p/33f175d97b86
https://www.jianshu.com/p/b0aa9100db16
http://www.cocoachina.com/ios/20170314/18865.html

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容