2012-06-04 98 views
0

我與某個概念有些混淆。問我的問題的最好方法是用一個例子來說明它。現在在下面的代碼中,我聲明瞭一個名爲loan的屬性,並且我綜合了這個屬性。現在,這可能看起來像一個白癡問題,但我將貸款價值「250.00」。我看到網絡上的教程可能會做「self.loan = 250.00;」 VS我的「貸款= 250.00」;「這兩種方式似乎都完成了同樣的事情。但爲什麼人們使用「self.propertyName」來訪問一個屬性,當使用屬性名稱本身就夠了?爲什麼Self被調用來訪問類自己的屬性?

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

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

-(void)doSomething{ 
    loan = 250.00; 
} 

回答

3

@synthesize也會爲您的屬性生成一個底層實例變量,不幸的是,該屬性的默認名稱與屬性相同。

這意味着當您使用loan = 250.0時,您確實直接訪問底層實例變量,而不是通過。財產訪問者。你可以看到這一點,如果你改變你的@synthesize行:

@synthesize loan = _loan; 

現在你的代碼不再編譯,你必須使用self.loan通過訪問它。生成的屬性訪問器或_loan來訪問底層實例變量。

+0

好吧,我明白了。因此,例如,這是正確的「self.loan = 10 + _loan;」這將是不正確的「self.loan = 10 + self.loan;」 – SNV7

+0

兩者都是正確的:'self.loan = 10 + self.loan'被編譯器翻譯爲'[self setLoan:10 + [self loan]]'(使用'@ synthesize'生成的方法)。使用'self.loan'(屬性訪問器)而不是'_loan'(直接實例變量)幾乎總是可取的。 –

1

其因self.loan引用而loan只是引用了基礎變量的屬性。對於具有retaincopy或其他修飾符的參考類型而言,它是關鍵。

2

他們不完全一樣。

self.loan = 250.00; 

是真的

[self setLoan:250.00]; 

這是一個方法調用速記;而loan = 250.00只是將該值直接寫入內存的適當部分。

例如,當另一段代碼使用鍵值觀察來監控貸款屬性的變化時,這種差異很重要。通過撥打setLoan:,所有正確的通知將被解僱。通過直接設置loan,他們不會。另外,如果您未使用自動引用計數,則set方法將確保新值保留並且舊值正確釋放。 (如果你使用ARC,這是自動照顧任何方式。)

相關問題