1

@property的应用程序的模型类中有一个将调用prepareForSegue:. 在我的CalculatorBrain课堂上是这样公开宣布的。

@property (readonly) id program.

吸气剂看起来像这样:

- (id)program
{
    return [self.programStack copy];
}

如果您需要知道,其中programStack一个存储用户输入的所有操作和操作数。NSMutableArray @propertyCalculatorBrain

计算器的控制器是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... 行设置断点,我们会得到:

在此处输入图像描述

两个快照都来自同一次运行。所以我的问题是,为什么 self.brain.program 的值在 prepareForSegue: 调用时会有所不同?也许这是一个非常愚蠢的错误,但我无法发现它。我会很感激这里的一些帮助。我对iOS开发很陌生。

更新:问题似乎出在 programStack 上。在该方法发挥作用niling之前,它以某种方式出现了。prepareForSegue:所以当这个运行时,我们会得到新的空程序堆栈。其他一些方法(据我所知不是我的)正在清除它。

有人知道什么可能会在这里清理我的财产吗?我有两个strong指向brain(CalculatorViewController 中的CalculatorBrain *)和(CalculatorBrain 中的programStackNSMutableArray *)的指针。

4

2 回答 2

0

程序的 getter 使用您的programStackfor 分配的复制方法,这需要programStack遵守NSCopying协议。真的programStack只是NSMutableArray吗?因为那确实服从NSCopying并且应该起作用。试试把副本拿出来?

更新:self.brain你的两个电话之间改变的价值是什么?

于 2012-11-18T23:03:44.637 回答
0

我的 CS193 代码非常相似,我看到的主要区别是我传递了程序的副本而不是对同一对象的引用。所以试试这个:

newController.program = [self.brain.program copy];
于 2012-11-19T05:04:10.220 回答