_property和self.property的区别

3

在处理属性时,我有些困惑。通过下面的例子来说明我的问题。从下面的例子中,我知道函数式上,“self.loan = self.loan + 250.00;”与“_loan = _loan + 250.00;”是相同的,或者说它们不同吗?我在网上看到许多教程,可能使用这两种方法来访问属性,那么使用_loan和self.loan有什么区别呢?(我知道self.loan与[self setLoan:]相同)

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

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

-(void)doSomething{
  self.loan = self.loan + 250.00; //Exhibit A
  _loan = _loan + 250.00; // Exhibit B 
} 

2
Big Nerd Ranch 的 Mark Dalrymple 写了一篇关于这个话题的好文章。做他所做的事情几乎从来不是一个坏主意。 - SSteve
可能是重复的问题:iPhone中self和普通变量之间的区别 - jscs
可能是之前500个帖子的重复。 - Hot Licks
3个回答

5

_loan是一个变量,给它赋值没有任何特定的副作用。

self.loan = self.loan + 250.00本质上与写[self setLoan:[self loan] + 250.00]是相同的,在这两种情况下都调用了方法,这些方法可能做的事情不仅仅是设置或获取变量的值。这些额外的操作取决于您是否编写了它们的自定义版本(即设置器和获取器)或使用@synthesize创建它们,以及如果使用@synthesize,则在@property声明中应用了哪些属性。


0
当你写出@synthesize loan = _loan;时,它基本上是简写,表示你正在合成的内容等同于一个私有成员,这类似于下面冗长的编码方式:
//ClassA.h
@interface ClassA: UIViewController {
    double _loan;
}

@property double loan;
@end

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

这是一个好的实践方法,以便您可以清楚地在类代码中使用 '_' 来表示私有成员,但在将其公开为其他不应显示的类的属性时。


-1

在访问属性时,永远不要直接引用变量。在您的代码中始终使用self.property。

如果您使用_property,则没有充分利用getter和setter。在这种情况下,您只是浪费@synthesize的使用。

self.loan = self.loan + 250.00; //示例A

这应该是正确的方法。


5
“Never” 这个词用的有些过头了。 - Hot Licks
特别是当您实现自定义的getter或setter时,使用属性本身会导致无限递归 :-) - gnasher729

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接