复制自定义对象

我有一个叫做Layer的对象,它有一些属性和一些方法。

我需要将Layer传递给第二个视图控制器:

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]; 

在SecondVC中,我可以改变属性。 然后我通过委托返回Layer对象;

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

现在我的问题是,我传递了一个指针,我的第一个视图控制器的图层对象,当我更新第二个视图控制器中的图层,我的第一个视图控制器的图层对象也正在更新。

因此,我不知道它是否已经改变(如果有的话,我需要运行一些代码)。

我怎样才能创build我的图层对象的副本,并通过,而不是我的第一个视图控制器的图层对象的指针?

编辑:

我曾尝试使用第二个init方法:

 -(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; } 

哪个没有解决。

EDIT2:

试着

 Layer *copyLayer = [self.myLayer copy]; layerView.myLayer = copyLayer; 

并得到错误

 -[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' 

解决了:

我向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]]; } 

这给了我一个Layer对象的副本

您将需要实现copyfunction到您的对象

在你的Layer.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; } 

现在在你的调用函数中

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