第26條 勿在分類中宣告屬性

2022-06-02 08:54:09 字數 1460 閱讀 1760

屬性是封裝資料的方式(參見第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,意味著該變數的作...