Objective c 在两个(或多个)视图控制器之间传递的对象是副本而不是指针

Objective c 在两个(或多个)视图控制器之间传递的对象是副本而不是指针,objective-c,xcode,object,Objective C,Xcode,Object,我有许多视图控制器,我通过子视图上定义的属性传递对象,并在推之前进行分配。我希望后续视图中对对象的任何更改都会在父视图中发布,并最终反映在链开始的主视图控制器上。因此,对象必须作为新实例在视图控制器之间复制,而不是通过引用(指针)传递 代码示例… [为了清楚起见,此代码使用UIPopoverController] SurveyListTableViewController *surveyList = [[SurveyListTableViewController alloc] init]; su

我有许多视图控制器,我通过子视图上定义的属性传递对象,并在推之前进行分配。我希望后续视图中对对象的任何更改都会在父视图中发布,并最终反映在链开始的主视图控制器上。因此,对象必须作为新实例在视图控制器之间复制,而不是通过引用(指针)传递

代码示例… [为了清楚起见,此代码使用UIPopoverController]

SurveyListTableViewController *surveyList = [[SurveyListTableViewController alloc] init];
surveyList.surveys = self.surveys;
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:surveyList];
surveyPopoverController = [[UIPopoverController alloc] initWithContentViewController:navController];
另一个代码示例。。。[此示例传递了一个核心数据管理对象“计划”]

UIStoryboard *storyboard = mainCanvasViewController.storyboard;
AddPlanViewController *addPlanViewController = [storyboard instantiateViewControllerWithIdentifier:@"AddPlanViewController"];
addPlanViewController.plan = [NSEntityDescription insertNewObjectForEntityForName:@"Plan" inManagedObjectContext:self.managedObjectContext];
[self.navigationController pushViewController:addPlanViewController animated:YES];
我是否可以强制通过引用/指针而不是通过值/副本进行传递?还是我需要一个完全不同的方法

非常感谢。
Michael。

如果你传递一个对象,你几乎总是传递一个对它的引用(不是副本)。传递副本其实并不容易

如果您认为它是副本,因为更改没有反映在原始文件中,请确保您实际存储了更改。您可能正在为对象赋值(也就是每次调用初始化并重置对象),请确保只声明和初始化对象一次


老实说,最好的策略是只传递对原始类的引用,该类包含要编辑的对象,然后只处理这些对象。因此,在popover控制器中添加一个名为
parentVC
的属性。然后在popover中,您可以执行
parentVC.nameOfObject
(前提是对象是视图控制器的属性。

查看您正在设置的属性的语义。一些属性设置为复制它们设置的对象,其他属性设置为仅保留对象。例如,字符串属性几乎总是设置为
复制
,原因有两个:1)像NSString这样的不可变类型无论如何都会保留而不是复制,2)如果有人碰巧传入了一个可变字符串,您通常不想在他们的眼皮底下更改它


无论如何,您可能会发现自己处理的是副本而不是原始对象,最可能的原因是属性语义是这样设置的。如果事实证明这是问题所在,并且属性是代码的一部分,那么显然可以更改属性声明以满足您的需要。否则,解决方案是让有问题的视图控制器执行它们的操作,然后在关闭它们之前检索属性。

对象的类型是什么?它们是如何被修改的?您是如何定义这些对象分配到的属性的?在本例中,“surveys”是根据核心数据NSFetchRequest创建的NSArray。我还传递了两个核心数据管理对象(自动生成的类)[我将更新我的原始帖子以包含一个示例]您是如何实现设置方法的/您的属性定义设置是什么?@property(nonatomic,retain)Plan*Plan;-所有“非原子”和“保留”的请求都是默认情况下发生的(即,将指针传递给对象)。您应该能够在每个控制器中看到相同的对象地址。由于NSArray是一个不可变的结构,您将无法在其他控制器中修改它,但您应该看到对其包含元素的更改,假设它们本质上允许这样做。你如何确定你看到的是副本?