我试图让这个图形计算器工作。我有两个视图控制器,一个用于计算器,另一个用于图形。分开他们工作正常。但是当我因为某种原因推动堆栈上的图形视图控制器时,它不起作用。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];
}
注:anExpression
,internalExpression
和expression
都意味着几乎相同的东西。他们持有我想要表达的表情。
我知道这有点复杂,但我希望有人能够至少指向正确的方向。
是'anObject'公布内任何地方'performOperation:'? – Jim 2011-03-06 01:17:38
我不这么认为,但为了测试你的想法,我直接给了'performOperation:'anObject'副本而不是'anObject',现在它可以工作!但是我仍然没有看到'performOperation:'放置'anObject'的位置。 – ladookie 2011-03-06 16:18:45