我試圖編寫一個計算器程序,但是當按下與函數expressionEvaluation關聯的特定鍵時,我遇到了這個錯誤。我的計算器工作正常,但我試圖添加使用/存儲變量的功能。爲此,我使用expressionEvaluation按鈕。但是,只要我按下鏈接到該方法的按鈕,整個應用程序崩潰,xcode給我錯誤EXC_BAD_ACCESS code = 2。我是新來的Objective-C,所以我不知道如何調試這個錯誤。據我所知,問題是與行Objective-C麻煩:EXC_BAD_ACCESS code = 2
double result = [CalculatorBrain evaluateExpression:self.brain.expression usingVariableValues:testValues];
...在我的視圖控制器。我在這條線之前設置了一個斷點,但它沒有崩潰,但將它設置在這條線上導致了我遇到的崩潰。 我試圖在下面切下代碼,並且只包含直接鏈接到expressionEvaluation按鈕的東西。感謝您的幫助!
下面是我的大腦方法.H:
// CalculatorBrain.h
#import <Foundation/Foundation.h>
@interface CalculatorBrain : NSObject
- (void) pushOperand:(double)operand;
- (void) setVariableAsOperand:(NSString *)variableName;
- (void) performWaitingOperation;
- (double) performOperation:(NSString *)operation;
@property (readonly) id expression;
+ (double)evaluateExpression: (id)anExpression
usingVariableValues: (NSDictionary *)variables;
+ (NSSet *)variablesInExpression:(id)anExpression;
+ (NSString *)descriptionOfExpression:(id)anExpression;
+ (id)propertyListForExpression:(id)anExpression;
+ (id)expressionForPropertyList:(id)propertyList;
@end
這裏的.M:
// CalculatorBrain.m
#import "CalculatorBrain.h"
#define VARIABLE_PREFIX @"^"
@interface CalculatorBrain()
@property (nonatomic) double operand;
@property (nonatomic, strong) NSString *waitingOperation;
@property (nonatomic) double waitingOperand;
@property (nonatomic) double storedOperand;
@property (nonatomic) NSMutableArray *internalExpression;
@end
@implementation CalculatorBrain
@synthesize operand = _operand; //operand in use
@synthesize waitingOperation = _waitingOperation; //waiting to be computed
@synthesize waitingOperand = _waitingOperand; //waiting to be used
@synthesize storedOperand = _storedOperand; //stored in memory
@synthesize internalExpression = _internalExpression; //private expression stored
@synthesize expression = _expression;
- (id) expression {;
return [NSMutableArray arrayWithArray:self.internalExpression];
}
//here I have instance methods that add objects to the array internalExpression
//these work fine as far as I can tell
+ (double) evaluateExpression:(id)anExpression usingVariableValues:(NSDictionary *)variables {
double result = 0;
int count = [anExpression count];
CalculatorBrain *brain;
for (int i = 0; i < count; i++) {
if([[anExpression objectAtIndex:i] isKindOfClass:[NSNumber class]]) {
double operand = [[anExpression objectAtIndex:i] doubleValue];
[brain pushOperand:operand];
}
if([[anExpression objectAtIndex:i] isKindOfClass:[NSString class]]) {
NSString *string = [anExpression objectAtIndex:i];
if([string characterAtIndex:0] == '^') {
NSString* variable = [NSString stringWithFormat:@"%c",[string characterAtIndex:1]];
double valueOfVariable = [[variables objectForKey:variable] doubleValue];
[brain pushOperand:valueOfVariable];
}
else {
NSString* operator = [anExpression objectAtIndex:i];
result = [brain performOperation:operator];
}
}
}
return result;
}
@end
下面是我的看法控制器.H:
// CalcViewController.h
#import <UIKit/UIKit.h>
//view controller for calculator
@interface CalcViewController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *display; //real-time display
@property (strong, nonatomic) IBOutlet UILabel *miniDisplay; //past display
@property (strong, nonatomic) IBOutlet UILabel *memDisplay; //display stored digits
- (IBAction)digitPressed:(UIButton *)sender; //pressed number
- (IBAction)operandPressed:(UIButton *)sender; //pressed operation
- (IBAction)variablePressed:(UIButton *)sender; //pressed variable
- (IBAction)expressionEvaluation:(UIButton *)sender; //evaluate expression with variables
@end
這裏的.m:
// CalcViewController.m
#import "CalcViewController.h"
#import "CalculatorBrain.h"
@interface CalcViewController()
@property (nonatomic, strong) CalculatorBrain *brain;
@property (nonatomic) BOOL userIsInTheMiddleOfTypingANumber;
@end
@implementation CalcViewController
- (CalculatorBrain *) brain {
if (!_brain) _brain = [[CalculatorBrain alloc] init];
return _brain;
}
- (IBAction)expressionEvaluation:(UIButton *)sender {
NSDictionary* testValues = [NSDictionary dictionaryWithObjectsAndKeys:@"x", 2, @"y", 3, @"z", 4, nil];
double result = [CalculatorBrain evaluateExpression:self.brain.expression usingVariableValues:testValues];
NSString *resultString = [NSString stringWithFormat:@"%g", result];
self.display.text = resultString;
}
@end
編輯:就像一個側面說明,我沒有得到任何錯誤,只有一個警告:不完整的實現。這是因爲我還沒有完成一對夫妻班的方法,但我不認爲這會導致車禍。
打開異常斷點: http://developer.apple.com/library/mac/#recipes/xcode_help-breakpoint_navigator/articles/adding_an_exception_breakpoint.html – lottscarson 2013-02-25 23:33:57
@lottscarson我跟着步驟添加一個異常斷點,然後試圖運行它,但它在同一個地方墜毀,沒有提出任何例外。 – 2013-02-25 23:40:20