0

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

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

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

-(void)doSomething{
  loan = 250.00;
}
4

3 回答 3

3

@synthesize还会为您的属性生成一个底层实例变量,不幸的是,默认情况下它的名称与属性相同。

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

@synthesize loan = _loan;

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

于 2012-06-04T00:50:37.660 回答
2

它们并不完全相同。

self.loan = 250.00;

真的是简写

[self setLoan:250.00];

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

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

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

于 2012-06-04T00:52:27.860 回答
1

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

于 2012-06-04T00:49:25.967 回答