如何在目标c中复制对象
我需要深层复制具有自己的对象的自定义对象。 我一直在阅读,有点困惑,如何inheritanceNSCopying和如何使用NSCopyObject。 有人能帮我吗? 谢谢阅读!
与引用types一样,有两个“复制”的概念。 我相信你知道他们,但为了完整性。
- 按位复制。 在这里,我们只是将内存位复制一下 – 这就是NSCopyObject所做的。 几乎总是,这不是你想要的。 对象具有内部状态,其他对象等,并且经常假设他们是唯一持有对该数据的引用的人。 按位拷贝打破了这个假设。
- 一个深刻的,逻辑的副本。 在这里,我们制作了一个对象的副本,但是实际上并没有一点点做 – 我们想要一个对于所有意图和目的performance相同的对象,但不是(必然地)对原始内存进行相同的克隆 – Objective C手册将这样的一个对象称为“function独立”的对象。 因为制作这些“智能”拷贝的机制因类而异,所以我们要求对象自己来执行它们。 这是NSCopying协议。
你想要后者。 如果这是你自己的对象之一,你只需要采用协议NSCopying和实现 – (id)copyWithZone:(NSZone *)区域。 你可以自由地做你想做的事情; 虽然这个想法是你自己做一个真正的副本,并将其返回。 您可以在所有字段上调用copyWithZone来进行深层复制。 一个简单的例子是
@interface YourClass : NSObject <NSCopying> { SomeOtherObject *obj; } // In the implementation -(id)copyWithZone:(NSZone *)zone { // We'll ignore the zone for now YourClass *another = [[YourClass alloc] init]; another.obj = [obj copyWithZone: zone]; return another; }
苹果文档说
copyWithZone:方法的子类版本应首先将消息发送到超级,以包含其实现,除非子类直接从NSObject下降。
添加到现有的答案
@interface YourClass : NSObject <NSCopying> { SomeOtherObject *obj; } // In the implementation -(id)copyWithZone:(NSZone *)zone { YourClass *another = [super copyWithZone:zone]; another.obj = [obj copyWithZone: zone]; return another; }
我不知道这个代码和我的区别,但是,我有这个解决scheme的问题,所以我多读一点,发现我们必须在返回之前设置对象。 我的意思是类似的
#import <Foundation/Foundation.h> @interface YourObject : NSObject <NSCopying> @property (strong, nonatomic) NSString *nombre;//nombre del medicamento @property (strong, nonatomic) NSString *linea;//linea a la que pertenece @property (strong, nonatomic) NSMutableString *tags;//palabras por las que se puede encontrar en el buscador @property (strong, nonatomic) NSString *htmlSource;//código html para mostrar su contenido @property (strong, nonatomic) NSMutableString *obj; -(id) copyWithZone: (NSZone *) zone; @end @implementation YourObject -(id) copyWithZone: (NSZone *) zone { YourObject *copy = [[YourObject allocWithZone: zone] init]; [copy setNombre: self.nombre]; [copy setLinea: self.linea]; [copy setTags: self.tags]; [copy setHtmlSource: self.htmlSource]; return copy; }
我把这个答案的原因,我有这个问题很多问题,我不知道为什么!,我不知道区别,但它的工作,也许可以是有用的:)
another.obj = [obj copyWithZone: zone];
我认为,这行会导致内存泄漏,因为你通过属性(我假设)声明为retain
访问obj
。 所以, 保留数将增加财产和copyWithZone
。
我相信它应该是:
another.obj = [[obj copyWithZone: zone] autorelease];
要么:
SomeOtherObject *temp = [obj copyWithZone: zone]; another.obj = temp; [temp release];
还有使用 – >操作符进行复制。 例如:
-(id)copyWithZone:(NSZone*)zone { MYClass* copy = [MYClass new]; copy->_property1 = self->_property1; ... copy->_propertyN = self->_propertyN; return copy; }
这里的推理是由此产生的复制对象应该反映原始对象的状态。 “。” 操作员可能会引入副作用,因为这个调用getter的方法可能包含逻辑。