UINavigationController推动问题

时间:2011-03-05 21:06:38

标签: iphone objective-c cocoa-touch

我正试图让这个图形计算器工作。我有两个视图控制器,一个用于计算器,另一个用于图形。他们分别工作得很好。但是当我因为某种原因将图形视图控制器推到堆栈上时它不起作用。

这是代码的一部分,用于计算在图形显示上绘制的y值

+ (double)evaluateExpression:(id)anExpression
         usingVariableValues:(NSDictionary *)dictionaryOfVariables
{
    CalculatorBrain *brain = [[CalculatorBrain alloc] init];
    double result = 0;

    for (id anObject in anExpression) {
        if ([anObject isKindOfClass:[NSNumber class]]) {
             brain.operand = [anObject doubleValue];
        } else if ([anObject isKindOfClass:[NSString class]]) {
            if ([anObject characterAtIndex:0] == '%') {
                 brain.operand = [[dictionaryOfVariables objectForKey:anObject] doubleValue];
            } else {
                 result = [brain performOperation:anObject];
            }
        }
     }

    [brain release];
    return result;      
}

由于某种原因,此函数在调用它的前五次正常工作,但在第六次,调试器说anObject已被解除分配并且我的程序崩溃(用NSZombiesEnabled确认)。 anExpression是一个NSArray,其中包含NSNumbers或NSStrings。我无法理解这个数组中的内容是如何或为什么被释放的。

这是将GraphViewController推送到UINavigationController堆栈的代码,并为其提供了它的属性:

- (IBAction)graph:(UIButton *)sender
{
    GraphViewController *gvc = [[GraphViewController alloc] init];
    gvc.graphModel.expression = [self brain].expression;
    gvc.graphModel.scale = 30;
    [self.navigationController pushViewController:gvc animated:YES];
    [gvc release];
}

gvc.graphModel.expression是传递到上面evaluateExpression: usingVariableValues:的表达式。

这是[自我大脑] .expression

的代码
- (id)expression
{
    id anExpression = [internalExpression copy];
    [anExpression autorelease];
    return anExpression;
}

这是首先将对象放入anExpression的代码:

- (void)addTerm:(id)anObject
{
    if (!internalExpression) internalExpression = [[NSMutableArray alloc] init];
    [internalExpression addObject:anObject];
}

注意:anExpressioninternalExpressionexpression都意味着几乎相同的事情。他们持有我试图绘制的表达方式。

我知道这有点复杂,但我希望有人能够至少指出我正确的方向。

2 个答案:

答案 0 :(得分:1)

当数组实际上没有对象时,很可能会释放一个对象。

答案 1 :(得分:0)

嘿,我认为是因为你是自动释放anExpression对象,并且调用对象没有保留它,所以当自动释放池最终被耗尽时anExpression正在释放。这也可以解释为什么它有时会起作用。

我认为使用以下内容可以解决这个问题:

gvc.graphModel.expression = [[self brain].expression retain];