CalculatorBrain.h
//建model------菜单 > NewFile > iOS > Cocoa Touch > Objective-C class // 完成操作数入栈和完成栈上的操作 #import <Foundation/Foundation.h> @interface CalculatorBrain : NSObject -(void)pushOperand:(double)operand; -(double)performOperation:(NSString *)operation; @end
CalculatorBrain.m
//这就是model,接受操作数,返回运算结果 #import "CalculatorBrain.h" @interface CalculatorBrain() //private的 @property(nonatomic,strong)NSMutableArray *operandStack; //一定要是strong,因为只有我们在使用这个指针,strong会告诉 @end //编译器怎么管理内存,当property创建时值为0或者nil,发消息给nil什么也不发生 //提问:如果不用nonatomic会怎样?会有警告。因为重载了getter但没重载setter,但是又要锁线程,所以给你一个警告。 @implementation CalculatorBrain @synthesize operandStack=_operandStack; //@synthesize不会生成getter了,因为底下我们自己实现了 //提问:synthesize会自动分配空间吗?不会,synthesize只有一个变量指针,需要你来分配空间 -(NSMutableArray *)operandStack //NSMutableArray的getter方法实现:如果operandStack为空那就分配一个数组 { //现在这个operandStack不可能是nil了 if(_operandStack==0) _operandStack=[[NSMutableArray alloc] init]; //lazy instantiation 延迟实例化,在iOS里经常用到 return _operandStack; } //没有用setter,因为没有特殊的事情要做 -(double)popOperand { NSNumber *operandObject=[self.operandStack lastObject]; //NSMutableArray的实例方法lastObject。 //lastObject是数组最后一个对象的指针而不是一个副本 if (operandObject) //如果对空数组做移除操作,不是nil是空,程序会崩溃 。前面的lastObject不会崩溃但removeLastObject会崩溃 [self.operandStack removeLastObject]; //NSMutableArray的实例方法removeLastObject return [operandObject doubleValue]; //NSNumber解封(开箱unboxing)doubleValue。 } -(void)pushOperand:(double)operand { [self.operandStack addObject:[NSNumber numberWithDouble:operand]]; //NSNumber封装(装箱boxing)numberWithDouble及NSMutableArray的实例方法addObject。 // 如果property创建operandStack的值为nil,此步什么也不发生。 //为了避免此情况,要用构造函数设置operandStack,本例这个设置在getter里执行。 } -(double)performOperation:(NSString *)operation { double result=0; double numB = [self popOperand]; double numA = [self popOperand]; if ([operation isEqualToString:@"+"]) //NSString的实例方法isEqualToString { result=numA+numB; } else if([@"*" isEqualToString:operation]) { result=numA*numB;} else if([@"-" isEqualToString:operation]) { result=numA-numB;} else if([@"/" isEqualToString:operation] && numB!=0) { result=numA/numB; } [self pushOperand:result]; //把结果压回到栈上,因为要继续操作 return result; } @end
时间: 2024-10-23 10:21:24