iOS Development

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

2018-02-28  本文已影响7人  里克尔梅西

定义:

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

上一篇 下一篇

猜你喜欢

热点阅读