類簇(class cluster)是一種設計模式,在foundation framework中被廣泛使用,舉個簡單的例子
nsarray
*arr=[
nsarray
arraywithobjects
:@"foo"
,@"bar"
,nil
];nslog
(@"arr class:%@",[
arrclass
]);// output: __nsarrayi
顯然__nsarrayi
是乙個私有類,來看看這個類的標頭檔案
@inte***ce
__nsarrayi : nsarray
//...
可以看出__nsarrayi
繼承了nsarray
。為什麼要這麼設計呢?拿nsnumber來舉個例子,我們都知道nsnumber可以儲存多種型別的數字,如int/float/double等等,一種方式是把nsnumber作為基類,然後分別去實現各自的子類,像這樣:
初看起來也沒什麼問題,但如果子類很多,像這樣:
這對使用者來說顯然不夠方便,得記住這麼多類。如果使用類簇,問題就變得簡單了,把number作為抽象基類,子類各自實現訪問方式,然後在基類中定義多個初始化方式,像這樣:
現在只需要記住乙個類就可以了。nsnumber
的初始化偽**大概像這樣:
-(id
)initwithbool-(
id)initwithlong
//...
@implementation
hbwate***llviewcontroller-(
id)initwithliked-(
id)initwithboardid:
(nsinteger
)boardid
#pragma mark - 通用的方法-(
psuicollectionviewcell*)
collectionview:
(psuicollectionview*)
collectionview
cellforitematindexpath:
(nsindexpath*)
indexpath
// ...
#pragma mark - 每個子類需要實現的方法-(
void
)fetchmoredata
使用起來類似這樣[[hbwate***llviewcontroller alloc]initwithboardid:9527]
或[[hbwate***llviewcontroller alloc]initwithliked]
。如果有新的datasource,新加乙個初始化方法即可,對於使用者來說,開啟標頭檔案,看下init開頭的方法就行了。
if
([[uidevice
currentdevice
]systemmajorversion
]<7)
else
不夠優雅,可以使用類簇的思想來去掉if/else判斷,把跟檢視具體元素無關的**放在基類,跟系統版本相關的**拆成兩個子類,然後在各自的類中載入相應的資源。
/* testview.h */
@inte***ce
testview: uiview
/* common method */-(
void
)test
;@end
/* testview.m */
@implementation
testview+(
id)alloc
else
}else}-
(void
)test
{}@end
這裡alloc
時並沒有返回testview
類,而是根據系統版本返回testviewios6
或testviewios7
。
/* testviewios6.m */
@implementation
testviewios6: testview-(
void
)drawrect:
(cgrect
)rect
@end
/* testviewios7.m */
@implementation
testviewios7-(
void
)drawrect:
(cgrect
)rect
@end
類簇的本質其實是抽象工廠,類簇也可以有多個基類,如nsarray
,nsmutablearray
, 後者就是繼承的前者。它對一些「大同小異」的問題,往往會有不錯的效果。
strategies to support ios7 ui
--eof--
**
類模板在專案開發中的應用
模板是c 型別引數化的多型工具。c 提供函式模板和類模板。模板定義以模板說明開始。類屬引數必須在模板定義中至少出現一次。同乙個類屬引數可以用於多個模板。類屬引數可用於函式的引數型別 返回型別和宣告函式中的變數。模板由編譯器根據實際資料型別例項化,生成可執行 例項化的函式。模板稱為模板函式 例項化的類...
OC中的類簇
類簇 class cluster 是一種設計模式,在foundation framework中被廣泛使用,舉個簡單的例子 nsarray arr nsarray arraywithobjects foo bar nil nslog arr class arr class output nsarray...
iOS開發 小白高階 iOS中的類
h檔案 inte ce mytest nsobject void initname nsstring newname end inte ce mytest告訴編譯器這是乙個新類 mytest 的介面,而nsobject則表示每個mytest類都是乙個nsobject,並且每個類都將繼承nsobjec...