copiar un objeto personalizado

Tengo un objeto llamado Layer que tiene algunos atributos y algunos métodos.

necesito pasar Layer a un segundo controlador de vista:

SecondVC *view = [self.storyboard instantiateViewControllerWithIdentifier:@"2VC"];
view.Layer = [[Layer alloc] initWithMapLayer:self.Layer];
view.delegate = self;

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:view];
navController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;

[self presentModalViewController:navController animated:YES];

en el SecondVC, puedo cambiar los atributos. Luego devuelvo el objeto Layer a través de un delegado;

-(void)done
{
    [self.delegate returnLayer:self.layer];

    [self dismissModalViewControllerAnimated:YES];
}

ahora mi problema es que estoy pasando un puntero al objeto Capa de mi primer controlador de vista y cuando actualizo la Capa en el segundo controlador de vista, el objeto Capa de mi primer controlador de vista también se actualiza.

debido a esto, no puedo decir si se ha cambiado (si es así, necesito ejecutar algún código).

¿Cómo puedo crear una copia de mi objeto Layer y pasar eso en lugar de un puntero al objeto Layer de mi primer controlador de vista?

EDIT:

Intenté usar un segundo método de inicio:

-(id)initWithLayer:(Layer *)Layer
{
    if (self = [super init])
    {
        self.call = [[FunctionCall alloc] init];        
        self.HUD = [[MBProgressHUD alloc] init];

        self.Layers = [[NSMutableDictionary dictionaryWithDictionary:Layer.Layers] copy];
        self.nameList = [[NSArray arrayWithArray:Layer.nameList] copy];
    }
    return self;
}

que no funcionó.

EDIT2:

probado

Layer *copyLayer = [self.myLayer copy];

layerView.myLayer = copyLayer;

y obtuve un error

-[layer copyWithZone:]: unrecognized selector sent to instance 0xfc72c40
2012-06-12 11:15:28.584 Landscout[8866:1fb07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Layer copyWithZone:]: unrecognized selector sent to instance 0xfc72c40'

SOLUCIONADO

agregué una copia profunda al método initWithLayer:

for (id key in layer.layers)
{
    [newLayers setValue:[[layer.layers objectForKey:key] mutableCopy] forKey:[key mutableCopy]];
}

for (id name in layer.nameList)
{
    [newList addObject:[name mutableCopy]];
}

esto me da una copia del objeto Layer

preguntado el 12 de junio de 12 a las 16:06

1 Respuestas

Necesitarás implementar copy función a su objeto

En tu Capa.m

- (id)copy
{
    Layer *layerCopy = [[Layer alloc] init];

    //YOu may need to copy these values too, this is a shallow copy
    //If YourValues and someOtherValue are only primitives then this would be ok
    //If they are objects you will need to implement copy to these objects too
    layerCopy.YourValues = self.YourValues;
    layerCopy.someOtherValue = self.someOtherValue;

    return layerCopy;
}

Ahora en su función de llamada

//instead of passing self.Layer pass [self.Layer copy]
view.Layer = [[Layer alloc] initWithMapLayer:[self.Layer copy]];

Respondido el 12 de junio de 12 a las 17:06

ok, intenté hacer esto con una llamada de inicio diferente. mis atributos son un diccionario y una matriz. ¿Necesitaría hacer una copia profunda del diccionario? - padin215

-copy copiará todo en el diccionario. Copiaría todo, en lugar de configurarlo con los mismos punteros. Así que haz esto:layerCopy.YourValues = [self.YourValues copy]; - justin paulson

Justin, ¿te refieres al método de copia creado por Omar o la copia de la palabra clave objetiva c? - padin215

todos las NSObjects implementar -copy de hecho, es posible que ni siquiera necesite implementar una copia en su subclase, puede funcionar sin escribirlo, creo que simplemente lo heredaría de NSObject, aunque no estoy seguro. - justin paulson

¿Has intentado pasar algo como layerCopy = [self.layer copy];? - justin paulson

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.