为什么要调用Self来访问Class自己的属性?

时间:2012-06-04 00:46:58

标签: iphone objective-c xcode ipad properties

我对某个概念感到有些困惑。问我问题的最好方法是用一个例子来说明。现在在下面的代码中我声明了一个名为loan的属性,我合成了这个属性。现在这可能看起来像一个不起眼的问题,但我将值“250.00”分配给贷款。我在网上看过可能做“self.loan = 250.00;”的教程。我的“贷款= 250.00;”两种方式似乎都完成了同样的事情。但是为什么人们使用“self.propertyName”来访问属性,当使用属性名称本身就足够了?

//ClassA.h
@interface ClassA: UIViewController
@property double loan;
@end

//ClassA.m
@implementation ClassA
@synthesize loan;

-(void)doSomething{
  loan = 250.00;
}

3 个答案:

答案 0 :(得分:3)

@synthesize还为您的属性生成基础实例变量,遗憾的是,该变量的名称与属性相同。

这意味着当您使用loan = 250.0时,您实际上是直接访问底层实例变量,而不是通过。物业访问者。如果您将@synthesize行更改为:

,则可以看到此消息
@synthesize loan = _loan;

现在您的代码不再编译,您必须使用self.loan来访问它。生成的属性访问器,或_loan来访问底层实例变量。

答案 1 :(得分:2)

它们并不完全相同。

self.loan = 250.00;

的简写
[self setLoan:250.00];

这是一个方法调用;而loan = 250.00只是将该值直接写入内存的适当部分。

例如,当另一段代码使用Key-Value Observing来监控贷款属性的变化时,这种差异很重要。通过调用setLoan:,将触发所有正确的通知。通过直接设置loan,他们不会。

此外,如果您未使用自动引用计数,则set方法将确保保留新值并正确释放旧值。 (如果您使用的是ARC,则无论如何都会自动处理。)

答案 2 :(得分:1)

因为self.loan引用了属性,而loan只引用了基础变量。它是具有retaincopy或其他修饰符的参考类型的关键。