如何从prepareForSegue调用'self'属性:?

时间:2012-11-18 22:35:59

标签: objective-c ios properties ios6 nsarray

我的应用的模型类中有@property,会调用prepareForSegue:。它在我的CalculatorBrain课程中公开宣布。

@property (readonly) id program.

getter看起来像这样:

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

如果您需要知道,programStackNSMutableArray @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中设置断点...行检查值,这是我们得到的:

enter image description here

这是正确的,当时程序有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 ...行中设置一个断点,这就是我们得到的:

enter image description here

两个快照来自同一次运行。所以我的问题是,为什么在prepareForSegue中self.brain.program的值不同:调用它?也许这是一个非常愚蠢的错误,但我无法发现它。我在这里得到一些帮助。我是iOS开发的新手。

更新:问题似乎与programStack有关。在niling方法发挥作用之前,它以某种方式prepareForSegue:出来。因此,当这个运行时,我们得到新的空的programStack。其他一些方法(据我所知,不是我的)正在清除它。

任何人都知道可能会在这里清理我的财产吗?我有两个strong指向brain(CalculatorViewMtroller中的CalculatorBrain *)和programStack(CalculatorBrain中的NSMutableArray *)。

2 个答案:

答案 0 :(得分:0)

程序的getter使用programStack上的复制方法进行分配,这需要programStack遵守NSCopying协议。 h programStack真的只是NSMutableArray?因为这确实服从NSCopying并且应该有效。试着取出副本吗?

更新:self.brain的值是否在两次通话之间发生变化?

答案 1 :(得分:0)

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

newController.program = [self.brain.program copy];