关于Copy

关于Copy


指针复制

- (void)viewDidLoad {
    [super viewDidLoad];

    /*
     指针复制,p1和p2的地址相同
     */
    RAPPerson *p1 = [RAPPerson new];
    RAPPerson *p2 = p1;
    NSLog(@"p1: %p---p2: %p", p1, p2);
}

对象复制

The exact meaning of “copy” can vary from class to class, but a copy must be a functionally independent object with values identical to the original at the time the copy was made.

  • 待复制的类必须遵守NSCopying协议,具体的复制细节取决于其对于copyWithZone:方法的实现。
  • 根据文档描述,复制出的对象,其值和原始对象相同,但功能上完全独立的对象。
  • 对于某些类,例如NSStringNSArray,copy并不总是意味着创建新的对象。系统会出于优化内存的目的,结合实际情况判断是否应该创建新的对象,或返回原本的对象。(具体出自哪个资料我忘记了,待查)
- (void)viewDidLoad {
    [super viewDidLoad];

    /*
     对象复制,p1和p2地址不同
     */
    RAPPerson *p1 = [RAPPerson new];
    p1.age = 100;
    RAPPerson *p2 = [p1 copy];
    NSLog(@"%d", p2.age);
    NSLog(@"p1: %p---p2: %p", p1, p2);
}

// 下面是RAPPerson类对于NSCopying协议的实现,及其定义的属性
@interface RAPPerson : NSObject <NSCopying>
/** 年龄 */
@property (nonatomic, assign) int age;

/** 朋友 */
@property (nonatomic, strong) NSArray *friends;
@end

@implementation RAPPerson
- (id)copyWithZone:(NSZone *)zone {
    RAPPerson *copy = [[RAPPerson allocWithZone:zone] init];
    copy.age = _age;
    copy.friends = _friends
    return copy;
}
@end


深层复制

  • 根据Effective Objective-C 2.0书中Item 22的描述,对象复制其实是浅层复制,即只复制了对象,但对象所携带的数据,即属性,没有得到复制。
  • 深层复制意味着不仅复制对象,而且复制对象的属性所指向的对象
  • 不管是NSCopying还是NSMutableCopying协议,都属于浅复制;想要实现深层复制,必须手动重写copyWithZone:方法。
@implementation RAPPerson
- (id)copyWithZone:(NSZone *)zone {
    RAPPerson *copy = [[RAPPerson allocWithZone:zone] init];
    copy.age = _age;
    // 不仅复制对象,还复制friends这个数组中所包含的所有对象
    copy.friends = [[NSArray alloc] initWithArray:_friends copyItems:YES];
    return copy;
}
@end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容