Stanford iOS之calculator(1)

 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;    

       if ([operation isEqualToString:@"+"])                               //NSString的实例方法isEqualToString    

       {         result=[self popOperand]+[self popOperand];     }

       else if([@"*" isEqualToString:operation])   

       {         result=[self popOperand]*[self popOperand];     }    

        else if([@"-" isEqualToString:operation])    

        {         result=[self popOperand]-[self popOperand];     }    

        else if([@"/" isEqualToString:operation])    

       {         result=[self popOperand]/[self popOperand];     }   

        [self pushOperand:result];                               //把结果压回到栈上,因为要继续操作   

        return result;

}

@end

 

Stanford iOS之calculator(1),,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。