我对某个概念感到有些困惑。问我问题的最好方法是用一个例子来说明。现在在下面的代码中我声明了一个名为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;
}
答案 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
只引用了基础变量。它是具有retain
,copy
或其他修饰符的参考类型的关键。