成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

類簇在iOS開(kāi)發(fā)中的應(yīng)用

移動(dòng)開(kāi)發(fā) iOS
類簇的本質(zhì)其實(shí)是抽象工廠,類簇也可以有多個(gè)基類,如NSArray, NSMutableArray, 后者就是繼承的前者。它對(duì)一些「大同小異」的問(wèn)題,往往會(huì)有不錯(cuò)的效果。

類簇(class cluster)是一種設(shè)計(jì)模式,在Foundation Framework中被廣泛使用,舉個(gè)簡(jiǎn)單的例子

  1. NSArray *arr = [NSArray arrayWithObjects:@"foo",@"bar", nil]; 
  2. NSLog(@"arr class:%@", [arr class]); 
  3. // output: __NSArrayI 

顯然__NSArrayI是一個(gè)私有類,來(lái)看看這個(gè)類的頭文件

  1. @interface __NSArrayI : NSArray { 
  2.     unsigned int _used; 
  3.  
  4. //... 

可以看出__NSArrayI繼承了NSArray。為什么要這么設(shè)計(jì)呢?拿NSNumber來(lái)舉個(gè)例子,我們都知道NSNumber可以存儲(chǔ)多種類型的數(shù)字,如Int/Float/Double等等,一種方式是把NSNumber作為基類,然后分別去實(shí)現(xiàn)各自的子類,像這樣:

初看起來(lái)也沒(méi)什么問(wèn)題,但如果子類很多,像這樣:

這對(duì)使用者來(lái)說(shuō)顯然不夠方便,得記住這么多類。如果使用類簇,問(wèn)題就變得簡(jiǎn)單了,把Number作為抽象基類,子類各自實(shí)現(xiàn)存取方式,然后在基類中定義多個(gè)初始化方式,像這樣:

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

  1. - (id)initWithBool 
  2.     return [[__NSCFBoolean alloc]init]; 
  3.  
  4. - (id)initWithLong 
  5.     return [[__NSCFNumber alloc]init]; 
  6.  
  7. //... 

在iOS項(xiàng)目中的應(yīng)用

在開(kāi)發(fā)app時(shí)經(jīng)常會(huì)遇到表現(xiàn)和行為完全一樣,但數(shù)據(jù)源不一樣的情況。以花瓣app為例,同樣是瀑布流,可能來(lái)自我喜歡的圖片、某個(gè)畫(huà)板下的圖片、 某個(gè)用戶的圖片等等。如果為每一種表現(xiàn)方式都新建一個(gè)Controller,并且使用這個(gè)Controller來(lái)初始化,那么就會(huì)遇到最開(kāi)始提到的問(wèn)題: 子類太多,使用不便。這正好可以通過(guò)類簇來(lái)很方便地搞定。比如這樣:

  1. @implementation HBWaterfallViewController 
  2. - (id)initWithLiked 
  3.     return [[HBLikedViewController alloc]init]; 
  4.  
  5. - (id)initWithBoardID:(NSInteger)boardID 
  6.     return [[HBBoardViewController alloc]initWithBoardID:boardID]; 
  7.  
  8. #pragma mark - 通用的方法 
  9.  
  10. - (PSUICollectionViewCell *)collectionView:(PSUICollectionView *)collectionView 
  11.                     cellForItemAtIndexPath:(NSIndexPath *)indexPath 
  12.     // ... 
  13.  
  14. // ... 
  15.  
  16. #pragma mark - 每個(gè)子類需要實(shí)現(xiàn)的方法 
  17.  
  18. - (void)fetchMoreData 
  19.     NSAssert(NO, @"子類需要實(shí)現(xiàn)此方法"); 

使用起來(lái)類似這樣[[HBWaterfallViewController alloc]initWithBoardID:9527][[HBWaterfallViewController alloc]initWithLiked]。如果有新的DataSource,新加一個(gè)初始化方法即可,對(duì)于使用者來(lái)說(shuō),打開(kāi)頭文件,看下init開(kāi)頭的方法就行了。

再舉個(gè)例子,現(xiàn)在很多應(yīng)用需要同時(shí)兼顧iOS6和iOS7,在表現(xiàn)上需要為不同的系統(tǒng)加載不同的圖片資源,最簡(jiǎn)單粗暴的方法就是各種if/else判斷,像這樣:

  1. if ([[UIDevice currentDevice]systemMajorVersion] < 7) 
  2.     /* iOS 6 and previous versions */ 
  3. else 
  4.     /* iOS 7 and above */ 

不夠優(yōu)雅,可以使用類簇的思想來(lái)去掉if/else判斷,把跟視圖具體元素?zé)o關(guān)的代碼放在基類,跟系統(tǒng)版本相關(guān)的代碼拆成兩個(gè)子類,然后在各自的類中加載相應(yīng)的資源。

  1. /* TestView.h */ 
  2. @interface TestView: UIView 
  3.  
  4. /* Common method */ 
  5. - ( void )test; 
  6.  
  7. @end 
  8.  
  9. /* TestView.m */ 
  10. @implementation TestView 
  11.  
  12. + (id)alloc 
  13.     if ([self class]== [TestView class]) 
  14.     { 
  15.         if ([[UIDevice currentDevice] systemMajorVersion] < 7) 
  16.         { 
  17.             return [TestViewIOS6 alloc]; 
  18.         } 
  19.         else 
  20.         { 
  21.             return [TestViewIOS7 alloc]; 
  22.         } 
  23.     } 
  24.     else 
  25.     { 
  26.         return [super alloc]; 
  27.     } 
  28.  
  29. - ( void )test 
  30. {} 
  31.  
  32. @end 

這里alloc時(shí)并沒(méi)有返回TestView類,而是根據(jù)系統(tǒng)版本返回TestViewIOS6TestViewIOS7

  1. /* TestViewIOS6.m */ 
  2. @implementation TestViewIOS6: TestView 
  3.  
  4. - (void)drawRect: (CGRect)rect 
  5.     /* Custom iOS6 drawing code */ 
  6.  
  7. @end 
  8.  
  9. /* TestViewIOS7.m */ 
  10. @implementation TestViewIOS7 
  11.  
  12. - (void)drawRect: (CGRect)rect 
  13.     /* Custom iOS7 drawing code */ 
  14.  
  15. @end 

小結(jié)

類簇的本質(zhì)其實(shí)是抽象工廠,類簇也可以有多個(gè)基類,如NSArray, NSMutableArray, 后者就是繼承的前者。它對(duì)一些「大同小異」的問(wèn)題,往往會(huì)有不錯(cuò)的效果。

參考

【移動(dòng)開(kāi)發(fā)視頻課程推薦】

責(zé)任編輯:閆佳明 來(lái)源: blog.leezhong
相關(guān)推薦

2011-08-17 14:20:21

IOS開(kāi)發(fā)GraphicsCon

2011-08-19 17:44:01

2009-12-29 14:58:31

WPF優(yōu)點(diǎn)

2025-05-06 08:55:00

2025-02-28 10:31:50

2015-07-02 14:38:44

2011-08-24 13:56:12

Lua游戲

2010-06-28 18:21:36

UML類圖設(shè)計(jì)

2012-02-13 14:22:22

MonoTouchiOS應(yīng)用Visual Stud

2011-08-22 16:26:25

IOS開(kāi)發(fā)Sqlite數(shù)據(jù)庫(kù)

2021-09-17 09:30:57

鴻蒙HarmonyOS應(yīng)用

2011-08-29 17:27:47

HTML 5交互移動(dòng)應(yīng)用

2011-08-22 15:47:27

Oracle臨時(shí)表存儲(chǔ)過(guò)程

2011-05-11 10:02:37

iOS

2010-03-01 10:45:59

WCF集合類

2022-12-06 23:43:53

iOSCreateML應(yīng)用

2015-03-18 09:29:12

iOS開(kāi)發(fā)爭(zhēng)議

2013-07-29 05:11:38

iOS開(kāi)發(fā)iOS開(kāi)發(fā)學(xué)習(xí)類的'生命周期'

2013-06-12 22:42:38

iOS7WWDCiOS開(kāi)發(fā)者

2024-05-06 08:08:31

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美a免费 | 精品久久久久久亚洲精品 | 国产美女在线观看 | av天天看 | 国产精品免费一区二区三区四区 | 免费视频久久久久 | 国产精品一级 | 黄色大片视频 | 久日精品 | 狠狠狠色丁香婷婷综合久久五月 | 欧美日韩一二三区 | 视频精品一区 | 久久久精品一区 | av中文在线 | www.成人.com | 精品av天堂毛片久久久借种 | 久久久久国产一区二区三区四区 | 久久99精品视频 | 午夜激情视频 | 国产91丝袜在线播放 | 在线精品一区二区三区 | 无码一区二区三区视频 | 中文字幕第三页 | 亚洲国产精品日韩av不卡在线 | 亚洲精品乱码久久久久久久久久 | 久久av一区 | 婷婷免费视频 | 龙珠z在线观看 | 久久久夜 | 亚洲精品久久国产高清情趣图文 | 日韩在线精品视频 | 日本在线黄色 | 亚洲欧美中文字幕在线观看 | 日韩成人精品一区二区三区 | 日本成人在线免费视频 | 99精品视频免费在线观看 | 99r在线| 黄视频免费观看 | 日韩在线视频一区 | 免费激情网站 | 涩涩鲁亚洲精品一区二区 |