2011-05-31 15 views
1

以下是Apple的「Your First iOS Application」文檔的代碼片段。iOS First Application「self.userName = textField.text」。何時使用自我

- (IBAction)changeGreeting:(id)sender { 

self.userName = textField.text; 

NSString *nameString = self.userName; 
if ([nameString length] == 0) { 
    nameString = @"World"; 
} 
NSString *greeting = [[NSString alloc] initWithFormat:@"Hello, %@!", nameString]; 
label.text = greeting; 
[greeting release]; 
} 

據我所知,self.username調用合成設置方法(重要的,因爲它有一個複製標誌)。

爲什麼textField.text和label.text不是self.textField.text和self.label.text。

兩者是否相等? 由於點符號已經存在,哪些已經可以訪問get方法,是不必要的?

回答

-1

你自己說,他們是相同的,因爲self.labellabel將指向同一個對象。

爲了更加清晰,我寧願使用self.label版本,但這完全是一種編碼習慣。

重要的是要指出,當您調用方法(不是免費的)時,使用self.label時性能會受到影響。但是,在大多數閱讀世界的情況下,性能受到影響並不明顯(只是很好知道)。

2

是:textField.text在這種情況下相當於self.textField.text,因爲合成的getter只是返回文本字段。據推測蘋果已經變得簡單了,因爲他們希望代碼是可讀的。儘管如此,我還是喜歡你的方法:對於屬性,堅持使用存取方法是個好習慣,以防你想要定製它們。

請注意,該屬性是與內部變量不同的實體。蘋果公司的風格是給它們兩個相同的名稱,但一些程序員喜歡通過給予內部變量下劃線前綴來區分這兩個概念。在這種情況下,_textField.text在此處的結果與self.textField.text相同。但是隻有第二種方法會訪問您的類爲文本字段生成的getter方法 - 第一種方式是將其權利作爲一段類內部代碼直接訪問內部變量。

+0

感謝您的澄清。假設textField是一個對象的類,已經適當地合成了getter和setter方法,那麼_textField.text是否會運行get方法?如果沒有,如果_textField的文本實例變量設置爲private,它會不可訪問嗎? – Ben 2011-05-31 14:56:44

+0

請注意,至少[某些情況下](http://tinyurl.com/4yxm7tf),Apple保留下劃線前綴以供自己使用。您最好使用下劃線後綴代替,例如使用'textField_'而不是'_textField'。 – Caleb 2011-05-31 15:49:48

+0

@Ben:是的,如果'_textField'對象具有'text'屬性,它應該提供一個getter(無論是否合成),並且點符號會調用它。如果它沒有提供一個,並且實例變量是私有的,那麼這些數據確實無法被其他類的對象訪問。 – 2011-06-01 09:18:55

0

是的,兩者都是一樣的。你可以使用self.label.text或label.text(無論哪個)都指向同一個對象。

2

不,他們不一樣。在您提供的代碼中,textField.text轉換爲[textField text],即獲得由伊娃指向的對象的text屬性。另一方面,self.textField.text轉換爲[[self textField] text],即,調用當前對象的訪問器,並調用結果的訪問器。

最終結果通常應該是一樣的。擁有伊娃和名爲textField的財產並讓財產返還伊娃以外的東西會有些奇怪。

兩者是否相等?是否自己 不必要,因爲點符號是 那裏已經有哪些已經 訪問get方法?

如上所述,結果類似,但含義不同。使用訪問器(即self.textField.text)是首選的風格,但在self.前加上所有內容似乎也有點乏味。如果要反覆使用屬性,一種可能的解決方法是調用屬性訪問器一次,並將結果保存在局部變量中。

相關問題