据我所知,self指的是当前的类,当我在self之后使用一个点时,就是使用它的一个属性。在这里的代码中有self.popOperand
中的用法,我不明白popOpernad是不是属性。另一件我不明白的是为什么
[self pushOperand:result];
有效,[self.pushOperand:result];
没有。
#import "Calcbrain.h"
@interface Calcbrain()
@property (nonatomic,strong) NSMutableArray *operandStack;
@end
@implementation Calcbrain
@synthesize operandStack = _operandStack;
-(NSMutableArray *) operandStack
{
if(_operandStack == nil) _operandStack = [[NSMutableArray alloc]init];
return _operandStack;
}
-(double)popOperand
{
NSNumber *objectNum = [self.operandStack lastObject];
if (objectNum)[self.operandStack removeLastObject];
return [objectNum doubleValue];
}
/*-(void) setOperandStack:(NSMutableArray *)operandStack
{
_operandStack = operandStack;
}*/
-(void)pushOperand:(double)opernand
{
[self.operandStack addObject:[NSNumber numberWithDouble:opernand]];
}
-(double)performOperation:(NSString *)operation
{
double result=0;
if([operation isEqualToString:@"+"])
{
result = self.popOperand + self.popOperand;
}
else if ([@"*" isEqualToString:operation])
{
result = self.popOperand * self.popOperand;
}
[self pushOperand:result];
return result;
}
@end
答案 0 :(得分:3)
虽然.
表示法主要用于属性,但它可用于返回值的无参数方法。为什么?因为属性的合成吸气剂的形式相同。
-(double)calcValue {
....
return value;
}
等同于属性声明:
@property (nonatomic, readonly) double calcValue;
虽然可能没有财产声明,但并不意味着不能使用.
表示法。在编译时,编译器将有效地将.
表示法更改为方法调用,因为.
是语法糖的一种形式。如此:
self.popOperand
// Translates to
[self popOperand];
这导致了第2部分,为什么[self.pushOperand:result];
不起作用?原因是.
不支持直接传递参数。
将参数分配/推送到属性的唯一方法是self.pushOperand = result
,但这不起作用,因为- (void)setPushOperand:(double)pushOperand;
没有.
[self pushOperand:result];
符号赋值映射到。
pushOperand:
之所以有效,是因为您在调用名为.
的特定方法时非常明确。
总体而言,仅对属性保留self
符号,如果您使用的方法并非设计为“'属性”,则应明确。
更新: Calcbrain
是一个保留关键字,代表指向我们当时正在处理的实例的指针。
例如,我可以在Calcbrain之外创建两个Calcbrain* instance1;
Calcbrain* instance2;
实例,例如BrainViewController :
Calcbrain
现在,-(double)performOperation:(NSString *)operation
已在其中声明了方法,让我们以[instance1 performOperation:@"+"];
[instance2 performOperation:@"+"];
为例。现在,如果我想从BrainViewController调用它,我会这样做:
instance1
因为我们正在调用一个属于另一个类的方法,所以我必须确定我创建的正确实例以引用它(即instance2
和self
)。但是我如何从类本身中调用它,并确保它适用于正确的实例?我创建的实例并不知道我创建的其他实例。使用self
。 performOperation
允许您在方法中引用自己。因此,如果我想在Calcbrain
内[self performOperation:@"+"];
,我需要使用self:
{{1}}
答案 1 :(得分:2)
“点”只是syntactic sugar,即使没有声明的属性也可以使用它。表达式
a.someProperty
相当于
[a someProperty]
和表达式
a.someProperty = c
相当于
[a setSomeProperty:c]
因此,self.popOperand
与[self popOperand]
相同。人们也可以在一些荒谬的案例中使用“点”,例如[NSMutableArray alloc].init
。
对非属性使用“dot”语法非常不鼓励。如果我是此代码的维护者,我会将所有self.popOperand
更改回[self popOperand]
以避免混淆。
(顺便说一句,没有定义+
的哪一方将首先得到评估。更好的改变
result = [self popOperand] + [self popOperand]
到
double operand1 = [self popOperand]
double operand2 = [self popOperand]
result = operand1 + operand2;
定义-
和/
时会出现问题。)
答案 2 :(得分:0)
Dot用于访问类的属性。您还可以访问没有点的属性和方法:
[classInstance someMethodOrProperty];
此代码:[classInstance someProperty];
等于此代码classInstance.someProperty;
您无法使用属性等点来调用方法。