对象复制

来源:互联网 发布:淘宝网中老年裙子 编辑:程序博客网 时间:2024/06/01 13:36

一.copymutablecopy方法

copy方法总是返回对象的不可修改的副本;mutablecopy方法总是返回该对象可修改的副本。当程序对复制的副本进行修改时,原对象不会受到影响。

 NSString *book = @"Hello"; NSMutableString *bookMutable = [book mutableCopy];        [bookMutable replaceCharactersInRange:NSMakeRange(2, 3) withString:@"Shit"];        NSMutableString *ebook = [NSMutableString stringWithString:@"Hello"];        NSString *ebookCopy = [ebook copy];

二.NSCopying与NSMutableCopying协议

为了保证一个对象可以调用copy(mutablecopy)方法来复制自身的不可变副本(可变副本),通常需要做如下事情:

  • 让该类实现NSCopying(NSMutableCopying)协议
  • 让该类实现copyWithZone:(mutableCopyWithZone:)方法

当调用对象的copy(mutablecopy)方法复制自身时,底层需要调用copyWithZone:mutableCopyWithZone:)方法的返回值。

-(id)copyWithZone:(NSZone *)zone{TT *t = [[[self class] allocWithZone:zone] init];t.name = self.name;t.age = self.age;return t;}

三.浅复制与深复制

当对象的实例变量是指针变量时,如果程序只是复制该指针的地址,而不是真正复制指针所指向的对象,这种复制就称为浅复制。

-(id)copyWithZone:(NSZone *)zone{TT *t = [[[self class] allocWithZone:zone] init];t.name = self.name;t.age = self.age;return t;}

上述代码实现的就是浅复制,因为对象t的name属性是指针类型。再看一下深复制:

-(id)copyWithZone:(NSZone *)zone{TT *t = [[[self class] allocWithZone:zone] init];t.name = [self.name mutablecopy];t.age = self.age;return t;}

Foundation框架中的类大部分都只实现了浅复制。

0 0
原创粉丝点击