我的应用的模型类中有@property
,会调用prepareForSegue:
。它在我的CalculatorBrain
课程中公开宣布。
@property (readonly) id program.
getter看起来像这样:
- (id)program
{
return [self.programStack copy];
}
如果您需要知道,programStack
是NSMutableArray @property
CalculatorBrain
,它存储用户输入的所有操作和操作数。
计算器的控制器是CalculatorViewController
,我有一个大脑的私人财产(一个CalculatorBrain)。在我的所有CalculatorViewController方法中,我可以完美地调用self.brain.program
。但是,当我尝试从prepareForSegue:
方法调用此getter时,返回一个空数组。这是我在CalculatorViewController中可以完美调用self.brain.program的方法示例:
- (IBAction)enterPressed
{
[self.brain pushOperand:[self.display.text doubleValue]];
self.userIsInTheMiddleOfEnteringANumber = NO;
// update history label
NSArray *stack = self.brain.program; //This is to test self.brain.program
self.history.text = [CalculatorBrain descriptionOfProgram:self.brain.program];
}
如果我们在self.history.text中设置断点...行检查值,这是我们得到的:
这是正确的,当时程序有2个对象。
现在这是我的prepareForSegue:
方法:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"Graph"]) {
GraphingCalcViewController *newController = segue.destinationViewController;
// send program to newController
NSArray *stack = self.brain.program; //This is to test self.brain.program
newController.program = self.brain.program;
}
}
如果我们在newController.program ...行中设置一个断点,这就是我们得到的:
两个快照来自同一次运行。所以我的问题是,为什么在prepareForSegue中self.brain.program的值不同:调用它?也许这是一个非常愚蠢的错误,但我无法发现它。我在这里得到一些帮助。我是iOS开发的新手。
更新:问题似乎与programStack有关。在niling
方法发挥作用之前,它以某种方式prepareForSegue:
出来。因此,当这个运行时,我们得到新的空的programStack。其他一些方法(据我所知,不是我的)正在清除它。
任何人都知道可能会在这里清理我的财产吗?我有两个strong
指向brain
(CalculatorViewMtroller中的CalculatorBrain *)和programStack
(CalculatorBrain中的NSMutableArray *)。
答案 0 :(得分:0)
程序的getter使用programStack
上的复制方法进行分配,这需要programStack
遵守NSCopying
协议。 h programStack
真的只是NSMutableArray
?因为这确实服从NSCopying
并且应该有效。试着取出副本吗?
更新:self.brain
的值是否在两次通话之间发生变化?
答案 1 :(得分:0)
我对CS193的代码非常相似,我看到的主要区别是我传递了程序的副本而不是对同一对象的引用。所以试试这个:
newController.program = [self.brain.program copy];