我正在通过斯坦福的iTunesU计划学习iOS开发。我遇到了一个意想不到的问题。
我添加了一个明确的方法,但是我收到了这个错误 //使用未声明的标识符'operandStack';你是说'_operandStack'吗?
我知道我可以通过使用[self.operandStack ...等而不是[operandStack
]来解决问题为什么我需要自己?不暗示吗?为什么在引用_operandStack时我不需要使用self?
#import“CalculatorBrain.h”
@interface CalculatorBrain()
//string because we are the only ones interested
@property (nonatomic, strong) NSMutableArray *operandStack;
@end
@implementation CalculatorBrain
@synthesize operandStack = _operandStack;
- (void) setOperandStack:(NSMutableArray *)operandStack
{
_operandStack = operandStack;
}
- (NSMutableArray *) operandStack
{
if(_operandStack==nil) _operandStack = [[NSMutableArray alloc] init];
return _operandStack;
}
- (void) pushOperand:(double)operand
{
NSNumber *operandObject = [NSNumber numberWithDouble:operand];
[self.operandStack addObject:operandObject];
}
- (double) popOperand
{
NSNumber *operandObject = [self.operandStack lastObject];
if (operandObject !=nil)
{
[self.operandStack removeLastObject];
}
return [operandObject doubleValue];
}
- (void) clear
{
//clear everything
[operandStack removeAllObjects];
// * ** * ** * ** * ** * ** * ** * ** * ** * ** //使用未声明的标识符'operandStack';你的意思是'_operandStack'吗?
}
- (double) performOperation:(NSString *)operation
{
double result =0;
//calculate result
if ([operation isEqualToString:@"+"]) {
result = [self popOperand] + [self popOperand];
} else if ([operation isEqualToString:@"*"]) {
result = [self popOperand] * [self popOperand];
} else if ([operation isEqualToString:@"π"]) {
[self pushOperand:3.14159];
NSNumber *operandObject = [self.operandStack lastObject];
return [operandObject doubleValue];
}
[self pushOperand:result];
return result;
}
@end
答案 0 :(得分:4)
因为你已经合成了它(注意:在较新的Objective-C版本中,合成是自动的):
@synthesize operandStack = _operandStack;
这意味着您生成了getter和setter,并通过调用它来访问该属性_operandStack。如果你想把它称为operantStack,请改为:
@synthesize operandStack;
如果使用self.operandStack,则使用属性生成的getter / setter,而不是合成的getter / setter。
使用合成和非合成属性是不同的,没有像许多人想的那样访问属性的“推荐方式”,它们只是具有不同的含义。例如:
- (void) setOperandStack:(NSMutableArray *)operandStack
{
_operandStack = operandStack;
}
您必须使用合成属性,否则您将进入无限循环。合成属性是自动生成的,非合成属性也会自动生成,但可以像在这种情况下那样被覆盖,也可以在外部访问。