iOS類簇

IOS 類簇

類簇(class cluster)是一種設計模式该默,在Foundation Framework中被廣泛使用腕唧,舉個簡單的例子

NSArray *arr = [NSArray arrayWithObjects:@"foo",@"bar", nil]; 
NSLog(@"arr class:%@", [arr class]); 
// output: __NSArrayI 
顯然__NSArrayI是一個私有類,來看看這個類的頭文件

@interface __NSArrayI : NSArray { 
    unsigned int _used; 
} 

可以看出__NSArrayI繼承了NSArray咖驮。為什么要這么設計呢吆寨?拿NSNumber來舉個例子窃款,我們都知道NSNumber可以存儲多種類型的數(shù)字,如Int/Float/Double等等框沟,一種方式是把NSNumber作為基類拾碌,然后分別去實現(xiàn)各自的子類,比如所float街望,int校翔,double
初看起來也沒什么問題,但如果子類很多灾前,這對使用者來說顯然不夠方便防症,得記住這么多類。如果使用類簇哎甲,問題就變得簡單了蔫敲,把Number作為抽象基類,子類各自實現(xiàn)存取方式炭玫,然后在基類中定義多個初始化方式奈嘿,像這樣:

現(xiàn)在只需要記住一個類就可以了。NSNumber的初始化偽代碼大概像這樣:

- (id)initWithBool 
{ 
    return [[__NSCFBoolean alloc]init]; 
} 
 
- (id)initWithLong 
{ 
    return [[__NSCFNumber alloc]init]; 
} 

也可以想這樣子

- (id)initWithType:(Type)type
{ 
    case:type
    {
         return [xxx new]; 
    }
    break;
   
   case:type
    {
         return [xxx new]; 
    }
    break;
} 
 

這樣做的好處就是在基類中不必做過多的判斷吞加,公共的方法可以寫在基類中裙犹,而不同的方法可以寫在各自的類中,這樣做可以使代碼更加的清晰衔憨。

在iOS項目中的應用現(xiàn)在很多應用需要同時兼顧不同的系統(tǒng)版本叶圃,在表現(xiàn)上需要為不同的系統(tǒng)加載不同的圖片資源,最簡單粗暴的方法就是各種if/else判斷践图,像這樣:

if ([[UIDevice currentDevice]systemMajorVersion] < 7) 
{ 
    /* iOS 6 and previous versions */ 
} 
else 
{ 
    /* iOS 7 and above */ 
} 

不夠優(yōu)雅掺冠,可以使用類簇的思想來去掉if/else判斷,把跟視圖具體元素無關的代碼放在基類码党,跟系統(tǒng)版本相關的代碼拆成兩個子類德崭,然后在各自的類中加載相應的資源。

/* TestView.h */ 
@interface TestView: UIView 
 
/* Common method */ 
- ( void )test; 
 
@end 
 
/* TestView.m */ 
@implementation TestView 
 
+ (id)alloc 
{ 
    if ([self class]== [TestView class]) 
    { 
        if ([[UIDevice currentDevice] systemMajorVersion] < 7) 
        { 
            return [TestViewIOS6 alloc]; 
        } 
        else 
        { 
            return [TestViewIOS7 alloc]; 
        } 
    } 
    else 
    { 
        return [super alloc]; 
    } 
} 
 
- ( void )test 
{} 
 
@end

這里alloc時并沒有返回TestView類揖盘,而是根據(jù)系統(tǒng)版本返回TestViewIOS6 或 TestViewIOS7眉厨。

/* TestViewIOS6.m */ 
@implementation TestViewIOS6: TestView 
 
- (void)drawRect: (CGRect)rect 
{ 
    /* Custom iOS6 drawing code */ 
} 
 
@end 
 
/* TestViewIOS7.m */ 
@implementation TestViewIOS7 
 
- (void)drawRect: (CGRect)rect 
{ 
    /* Custom iOS7 drawing code */ 
} 
 
@end 
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市扣讼,隨后出現(xiàn)的幾起案子缺猛,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荔燎,死亡現(xiàn)場離奇詭異耻姥,居然都是意外死亡,警方通過查閱死者的電腦和手機有咨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門琐簇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人座享,你說我怎么就攤上這事婉商。” “怎么了渣叛?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵丈秩,是天一觀的道長。 經(jīng)常有香客問我淳衙,道長蘑秽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任箫攀,我火速辦了婚禮肠牲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘靴跛。我一直安慰自己缀雳,他們只是感情好,可當我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布梢睛。 她就那樣靜靜地躺著肥印,像睡著了一般。 火紅的嫁衣襯著肌膚如雪扬绪。 梳的紋絲不亂的頭發(fā)上竖独,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天,我揣著相機與錄音挤牛,去河邊找鬼。 笑死种蘸,一個胖子當著我的面吹牛墓赴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播航瞭,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼诫硕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了刊侯?” 一聲冷哼從身側(cè)響起章办,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后藕届,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挪蹭,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年休偶,在試婚紗的時候發(fā)現(xiàn)自己被綠了梁厉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡踏兜,死狀恐怖词顾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情碱妆,我是刑警寧澤肉盹,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站疹尾,受9級特大地震影響垮媒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜航棱,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一睡雇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧饮醇,春花似錦它抱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至祠墅,卻和暖如春侮穿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背毁嗦。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工亲茅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人狗准。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓克锣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親腔长。 傳聞我的和親對象是個殘疾皇子袭祟,可洞房花燭夜當晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容