你什么时候自己使用一个点

时间:2012-11-01 12:09:10

标签: objective-c

据我所知,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

3 个答案:

答案 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; 实例,例如Br​​ainViewController

Calcbrain

现在,-(double)performOperation:(NSString *)operation已在其中声明了方法,让我们以[instance1 performOperation:@"+"]; [instance2 performOperation:@"+"]; 为例。现在,如果我想从BrainViewController调用它,我会这样做:

instance1

因为我们正在调用一个属于另一个类的方法,所以我必须确定我创建的正确实例以引用它(即instance2self)。但是我如何从类本身中调用它,并确保它适用于正确的实例?我创建的实例并不知道我创建的其他实例。使用selfperformOperation允许您在方法中引用自己。因此,如果我想在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;您无法使用属性等点来调用方法。