屬性是封裝資料的方式(參見第6條)。
屬性只是定義例項變數及相關訪問方法所用的「語法糖」,所以也應遵循同例項變數一樣的規則。
分類機制,應該將其理解為一種手段,目標在於擴充套件類的功能,而非封裝資料。
儘管從技術上說,分類裡也可以宣告屬性,但這種做法應該盡量避免。
原因是:除了「class-continuation分類」(參見第27條)之外,其他分類都無法向類中新增例項變數,因此,它們無法把實現屬性所需的例項變數合成出來。
所以開發者需要在分類中為該屬性實現訪問方法。
1)此時可以把方法宣告為@dynamic,也就是說,這些方法等到執行期再提供,編譯器目前是看不見的。如果決定使用訊息**機制(參見第12條)在執行期攔截方法呼叫,並提供其實現,那麼或許可以採用這種做法。
2)關聯物件(參見第10條)能夠解決在分類中不能合成例項變數的問題。
缺點:相似的**要寫很多遍,而且記憶體管理問題上容易出錯。
例:#import <objc/runtime.h>
static constchar*kfriendspropertykey = "kfriendspropertykey";
@implementation person(friendship)
-(nsarray*)friends {
returnobjc_getassociatedobject(self, kfriendspropertykey);
-(void)setfriends:(nsarray*)friends {
objc_setassociaedobject(self, kfriendspropertykey, friends, objc_association_nonatomic);
@end
3、唯讀屬性可以在分類中使用。屬性可以不需要由例項變數來實現。
由於唯讀屬性在.m中只有乙個getter方法,
即實現了該屬性所需的全部方法,所以編譯器不會再為屬性自動合成例項變數。也就滿足上面的條件了,編譯器也就不會發出警告資訊。
總結:即便這3種方法可以實現,但不推薦。
而應該把封裝資料所用的全部屬性都定義在主介面裡。
在「class-continuation分類」之外的其他分類中,可以定義訪問方法,但盡量不要定義屬性。
第26月第20天 springboot
1 pom.xml中新增支援web的模組 org.springframework.boot spring boot starter web pom.xml檔案中預設有兩個模組 spring boot starter 核心模組,包括自動配置支援 日誌和yaml spring boot starter ...
第26章 最大流
一 流網路 流網路g v,e 是乙個有向圖,圖中每條邊 u,v 有乙個非負的容量值c u,v 0。而且如果邊集合e包含一條邊 u,v 則圖中不存在反方向的邊 v,u 如果邊 u,v 不屬於e,則定義c u,v 0,並且圖中不允許自迴圈。在流網路的所有結點中,我們特別分別出兩個特殊結點,源結點s和匯點...
勿在標頭檔案中定義static變數
看到有一位同學在標頭檔案中這麼寫 static const wchar t g str1 static const wchar t g str2 這種定義變數的方式我從來沒有見過,而且它還能順利通過編譯,於是我很想知道編譯器是如何處理這種變數定義的。定義全域性變數時使用static,意味著該變數的作...