我有对象复制问题。
@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存储到数组中的对象。
答案 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
个对象作为实例变量。根据我的经验,这是非常不寻常的,只是将它们用作构建不可变字符串的临时对象。我怀疑你没有使用正确的数据类型来保存这些数据。