我正试图让这个图形计算器工作。我有两个视图控制器,一个用于计算器,另一个用于图形。他们分别工作得很好。但是当我因为某种原因将图形视图控制器推到堆栈上时它不起作用。
这是代码的一部分,用于计算在图形显示上绘制的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];
}
注意:anExpression
,internalExpression
和expression
都意味着几乎相同的事情。他们持有我试图绘制的表达方式。
我知道这有点复杂,但我希望有人能够至少指出我正确的方向。
答案 0 :(得分:1)
当数组实际上没有对象时,很可能会释放一个对象。
答案 1 :(得分:0)
嘿,我认为是因为你是自动释放anExpression
对象,并且调用对象没有保留它,所以当自动释放池最终被耗尽时anExpression
正在释放。这也可以解释为什么它有时会起作用。
我认为使用以下内容可以解决这个问题:
gvc.graphModel.expression = [[self brain].expression retain];