码迷,mamicode.com
首页 > 其他好文 > 详细

[Stanford] RPN Calculator(model)

时间:2014-10-03 14:13:34      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   os   使用   ar   for   strong   

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

 

[Stanford] RPN Calculator(model)

标签:style   blog   color   io   os   使用   ar   for   strong   

原文地址:http://www.cnblogs.com/Xylophone/p/4004833.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!