修改数组对象的副本会影响存储在数组中的对象

时间:2014-04-22 09:22:39

标签: ios uitableview nsmutablearray

我有对象复制问题。

@property (nonatomic,strong)ITEM *editingItem;
self.editingItem= nil;
self.editingItem = [[self.ItemsArray objectAtIndex:indexPath.row-1] copy];
self.editingrowIndex = indexPath.row;

当我在didselect表行中为editItem分配一些对象并在更改对象属性值时在textfield委托中开始编辑它然后它在存储在数组中的对象中变换。但是我只想要editingItem对象应该有新的值。但是没有更新数组,新的值将从editingItem存储到数组中的对象。

2 个答案:

答案 0 :(得分:0)

#import <Foundation/Foundation.h>

@interface Item : 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 TempObject


-(id) copyWithZone: (NSZone *) zone
{
    Item *copy = [[Item allocWithZone: zone] init];

    [copy setNombre: self.nombre];
    [copy setLinea: self.linea];
    [copy setTags: self.tags];
    [copy setHtmlSource: self.htmlSource];

    return copy;
}

覆盖item类中的CopywithZone方法并设置该方法中的每个属性。它是复制object的解决方案。当你执行allocwithzone和init时,新对象是用新地址和旧值创建的,你需要在copywithzone中手动设置:method.So使用旧值复制实例。这对我来说是完美的解决方案。

答案 1 :(得分:0)

OP提供的实现,在另一个答案中是不正确的,因为它不复制实例变量;而是它创建了另一个对它们的引用。这可以解释OP在他的问题中看到的问题(该代码应该在哪里呈现,而不是在单独的答案中)。

这是一个更好的实现:

- (id)copyWithZone:(NSZone *)zone
{
    Item *copy = [[Item allocWithZone:zone] init];

    copy->_nombre: [_nombre copy];
    copy->_linea = [_linea] copy];
    copy->_tags = [_tags copy];
    copy->_htmlSource = [_htmlSource copy];

    return copy;
}

请注意,其他实现中提供的实例变量copy语句是正确的(除了缺少copy调用),但它不能用于私有实例变量(常见),所以我始终坚持copy->_instanceVariable = [_instanceVariable copy];形式。

另请注意,如果对象派生自NSObject以外的其他内容,则第一个语句应为:

Item *copy = [super copyWithZone:zone];

而不是:

Item *copy = [[Item allocWithZone:zone] init];

补充说明:

我发现你非常怀疑你将NSMutableString个对象作为实例变量。根据我的经验,这是非常不寻常的,只是将它们用作构建不可变字符串的临时对象。我怀疑你没有使用正确的数据类型来保存这些数据。