2011-03-05 80 views
0

我试图让这个图形计算器工作。我有两个视图控制器,一个用于计算器,另一个用于图形。分开他们工作正常。但是当我因为某种原因推动堆栈上的图形视图控制器时,它不起作用。UINavigationController推送问题

这是计算的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是一个带有NSNumbers或NSStrings的NSArray。我无法理解如何或为什么这个数组中的东西被释放。

这是推动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都意味着几乎相同的东西。他们持有我想要表达的表情。

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

+1

是'anObject'公布内任何地方'performOperation:'? – Jim 2011-03-06 01:17:38

+0

我不这么认为,但为了测试你的想法,我直接给了'performOperation:'anObject'副本而不是'anObject',现在它可以工作!但是我仍然没有看到'performOperation:'放置'anObject'的位置。 – ladookie 2011-03-06 16:18:45

回答

1

当它实际上并不拥有该对象时,最有可能释放数组中的一个对象。

+0

我看不到它。有没有办法找出谁使用调试器释放它? – ladookie 2011-03-05 21:29:36

+0

不是我所知道的。但是使用XCode中的“构建和分析”选项很有可能会为您添加标记。 – Anomie 2011-03-05 21:37:01

+0

它没有任何东西,谢谢。 – ladookie 2011-03-05 21:45:15

0

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

我认为使用下面应该解决这个问题:

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

我试过了,没有运气(表达式是graphModel中的retain @property)。它不是被释放的数组(表达式),它是数组中正在释放的对象。当我发送消息给数组中的一个对象时,程序崩溃。 – ladookie 2011-03-05 23:01:58

+0

这是我在调试器控制台中得到的错误消息: 'GraphingCalculator [39904:207] *** - [CFString isKindOfClass:]:发送到释放实例0x4b306b0的消息。 0x4b306b0是evaluateExpression:usingVariableValues:方法中的for-in循环中的'anObject'。 – ladookie 2011-03-05 23:05:49