簡體   English   中英

@property和“看起來”像屬性的方法的getters / setters有什么區別?

[英]What is the difference between an @property and getters/setters for methods that “look” like properties?

我了解主要差異/過程。 屬性為類變量創建吸氣劑和吸氣劑。 它還(現在)使用帶有_前綴的私有變量對其進行合成。

大。

現在,我希望某些方法像屬性一樣。 所以我有一個UIView子類,其中有一個UILabel子視圖。

我想創建兩個方法- (NSString *)textsetText:(NSString *)text ,以設置和獲取UILabel的文本。

顯然,這就像一個屬性(您可以執行[myCustomElement text][myCustomElement setText:@"whatever"] )一樣,所以我覺得我應該定義一個屬性,但是,如果有的話,它有什么用?

我的getter和setter方法將如下所示:

- (NSString *)text {
    return self.textLabel.text;
}

- (void)setText:(NSString *)text {
    self.textLabel.text = text;
}

您可以這樣做,但我不鼓勵您這樣做。 要擁有看起來像標准訪問器方法(getter和setter)但實際上正在更新UI控件的方法,將來只會引起混亂。 這僅在方法執行不符合常規慣例的功能時才會破壞代碼的可讀性。 另外,您已經為textLabel提供了一個屬性,因此這些方法不會給您帶來多少好處。

順便說一句,標准的自動生成的訪問器方法還提供了其他有用的功能(根據您在定義屬性時指定的限定符進行必要的內存管理,為將來可能需要此功能的某個日期啟用鍵值觀察 ,等),因此除非您是這些概念的專家,否則我將不願使用您自己的方法來替換它們。

如果您要執行的操作與標准訪問器方法不同,則建議使用將來不太可能引起混亂的方法名稱。

text已經是yourCustomElement屬性textLabel的一個屬性(稱為text )(這就是為什么您使用點表示法yourCustomElement.textLabel.text對其進行訪問的原因)

在此示例中,text屬性的getter / setter方法應該/只能在textLabel類中

這兩種方法只是設置/獲取屬性屬性的便捷方法(很好,但是它們不是獲取/設置方法,因此不應看起來)

我認為對於您的特定示例,最好不定義屬性。

屬性(據我所知)提供了方便的速記方式,可確保在引擎蓋下適當地保留/釋放(如果適用)。

http://useyourloaf.com/blog/2011/02/08/understanding-your-objective-c-self.html

如果有的話,這有什么用?

有很多用途

1)您可以使用屬性來執行一些計算,更新對象的狀態或某些諸如此類的緩存。

2)您是否聽說過可可中的鍵值 編碼(KVC)鍵值觀察(KVO) 它們取決於屬性。 檢查: KVC編程指南KVO編程指南

3)使用屬性,您可以在訪問器中放入一些內存管理代碼。

如果將其聲明為屬性,並覆蓋getter / setter,則可以使用點表示法更改或檢索值。

例如:

myCustomElement.text = @"whatever";

long storry short:@synthesis生成getter和setter。 因此,使用綜合功能可以節省您的鍵入時間。

但是,您的代碼與@synthesis textLabel因為您的代碼僅允許更改標簽文本。 @synthesis將允許更改所有屬性。

這是有關@synthesis / getters / setters的一些有用信息

http://useyourloaf.com/blog/2012/08/01/property-synthesis-with-xcode-4-dot-4.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM