I’m trying to get this graphing calculator to work. I have two view controllers, one for the calculator and one for the graph. separately they work fine. But when I push the graph view controller on the stack for some reason it doesn’t work.
This is the part of the code that computes a y-value to draw on the display for the graph
+ (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;
}
for some reason, this function works fine the first five times it is called, but on the sixth time, the debugger says that anObject has been deallocated and my program crashes (confirmed with NSZombiesEnabled). anExpression is an NSArray with either NSNumbers or NSStrings in it. I cannot fathom how or why stuff in this array is being deallocated.
this is the code that pushes the GraphViewController onto the UINavigationController stack, and gives it it’s properties:
- (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 is the expression that gets passed into evaluateExpression: usingVariableValues: above.
and this is the code called for [self brain].expression
- (id)expression
{
id anExpression = [internalExpression copy];
[anExpression autorelease];
return anExpression;
}
This is the code that puts objects into anExpression in the first place:
- (void)addTerm:(id)anObject
{
if (!internalExpression) internalExpression = [[NSMutableArray alloc] init];
[internalExpression addObject:anObject];
}
Note: anExpression, internalExpression, and expression all mean pretty much the same thing. they hold the expression I’m trying to graph.
I know this is a bit complex, but I was hoping someone could at least point me in the right direction.
Most likely something is releasing one of the objects in your array when it doesn’t actually own the object.