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

無線客戶端框架設計(4):自定義生命周期的設計(iOS篇)

移動開發 iOS
熟悉網站端編程的人笑了,沒錯,這種新的生命周期,就是從javascript中借鑒來的。js是一門弱語言,所以需要自定義生命周期并按部就班在不同的方法中寫不同的方法,生命周期的重新定義,或者說是擴展,只是js代碼框架中的一個小部分。

首先要確定一點,我們的App,要基于XIB文件進行編程,而不是在每個相應的ViewController里面去手動創建頁面的每個控件。這樣做 的好處是,將頁面布局與業務邏輯徹底隔離。于是我們可以把xib的繪制工作交給美工人員,而iOS程序員,主要關心的是業務邏輯。

有人會懷疑過多的xib會導致App體積變大,我曾經有專門看過ipa文件解壓后的文件列表,我發現每個xib也就2k大小,而一個App最多也就 七八十個xib,那么就是說共計150k大小的樣子,由于是xml文本文件,所以壓縮后更小。而相比較下,占用App體積最多的,往往是開機畫面圖,引導 圖這些東西,如果真的想要App瘦身,應該在圖片上進行優化,而不是不使用xib直接布局。

另一個需要明確的是,在一開始創建ViewController的時候,不要同時創建xib文件,因為這樣子的話,就在xib中把 ViewController和xib進行關聯了,而我們要做的是解耦,這顯然不合理。所以正確的流程是,分開創建ViewController和 xib,不要進行管理。在ViewController的初始化中,加載xib文件,如下所示:

接下來要做的事情,有時候連我都覺得匪夷所思。我們先來看一段代碼:

  1. #import "APageViewController.h" 
  2.  
  3. @interface APageViewController () 
  4.  
  5. @end 
  6.  
  7. @implementation APageViewController 
  8.  
  9. - (void)loadView 
  10.     [super loadView]; 
  11.     // Do any additional setup after loading the view. 
  12.  
  13.     //1.從xib中獲取View 
  14.     NSArray* list = [[NSBundle mainBundle] loadNibNamed: @"APageView" owner: self options: nil]; 
  15.     self.view = list.lastObject; 
  16.      
  17.     UILabel* nameLabel = (UILabel*)[self.view viewWithTag: 100]; 
  18.     nameLabel.text = @""
  19.      
  20.     UILabel* ageLabel = (UILabel*)[self.view viewWithTag: 200]; 
  21.     ageLabel.text = @""
  22.      
  23.     UIButton* getInfoButton = (UIButton*)[self.view viewWithTag: 300]; 
  24.     [getInfoButton addTarget: self action: @selector(getInfo) forControlEvents:UIControlEventTouchUpInside]; 
  25.      
  26.     UIButton* clearInfoButton = (UIButton*)[self.view viewWithTag: 400]; 
  27.     [clearInfoButton addTarget: self action: @selector(clearInfo) forControlEvents:UIControlEventTouchUpInside]; 
  28.  
  29. - (void) getInfo { 
  30.     UILabel* nameLabel = (UILabel*)[self.view viewWithTag: 100]; 
  31.     nameLabel.text = @"包小強"
  32.      
  33.     UILabel* ageLabel = (UILabel*)[self.view viewWithTag: 200]; 
  34.     ageLabel.text = @"31.6"
  35.  
  36. - (void) clearInfo { 
  37.     UILabel* nameLabel = (UILabel*)[self.view viewWithTag: 100]; 
  38.     nameLabel.text = @""
  39.      
  40.     UILabel* ageLabel = (UILabel*)[self.view viewWithTag: 200]; 
  41.     ageLabel.text = @""
  42.  
  43. - (void)dealloc { 
  44.     [super dealloc]; 
  45.  
  46. @end 

上面的代碼,是再普通不過的一段代碼,讀取一個xib,獲取到View的句柄,初始化其中的每個控件,為按鈕掛上點擊后的方法事件,使得按鈕變紅。 內部還有個計數器變量,每次點擊按鈕都會加1。巧的是,恰好還要偵聽一個通知(Notification)。最后,調用API。

我們發現,有2個問題:

1)在willDidLoad中做了太多的事情,又是初始化變量,又是初始化控件,又是給按鈕掛事件,注冊通知,還要調用API。

2)每次使用控件時,都要根據在xib中指定的tag重新獲取,而iOS中的控件tag值,只能是整數。

我們的解決方案是,既然頁面每次加載都會調用loadView和viewDidLoad方法,每次銷毀都會調用dealloc方法,那么干脆就在基類BaseViewController重寫了這幾個方法,于是現在頁面的生命周期如下所示:

201309051002.jpg

相應的基類代碼請參見本章的源碼。

我們在每個頁面都會重寫createFields、loadData這些方法,每個方法的意義如下:

1)createFields和destroyFields: 創建/銷毀頁面級變量的地方。

2)createViews和destroyViews: 創建/銷毀頁面內控件的地方。

3)createEvents和destroyEvents: 創建/銷毀頁面內事件、通知的地方。

4)loadData: 如果頁面加載過程需要調用MobileAPI,則寫在這個地方。

我們在程序里把代碼分門別類寫在各自的地方,易于管理(避免了經常會聲明了變量而忘記銷毀的問題)。

于是剛才的代碼文件,我們將其重構為:

  1. #import "APageViewController.h" 
  2.  
  3. @interface APageViewController () { 
  4.     UILabel* nameLabel; 
  5.     UILabel* ageLabel; 
  6.     UIButton* getInfoButton; 
  7.     UIButton* clearInfoButton; 
  8.  
  9. @end 
  10.  
  11. @implementation APageViewController 
  12.  
  13. - (void)createFields { 
  14.  
  15.  
  16. - (void)destroyFields { 
  17.      
  18.  
  19. - (void)createViews { 
  20.     //1.從xib中獲取View 
  21.     NSArray* list = [[NSBundle mainBundle] loadNibNamed: @"APageView" owner: self options: nil]; 
  22.     self.view = list.lastObject; 
  23.      
  24.     nameLabel = (UILabel*)[self.view viewWithTag: 100]; 
  25.     nameLabel.text = @""
  26.      
  27.     ageLabel = (UILabel*)[self.view viewWithTag: 200]; 
  28.     ageLabel.text = @""
  29.      
  30.     getInfoButton = (UIButton*)[self.view viewWithTag: 300];     
  31.     clearInfoButton = (UIButton*)[self.view viewWithTag: 400]; 
  32.  
  33. - (void)destroyViews { 
  34.      
  35.  
  36. - (void)createEvents { 
  37.     [getInfoButton addTarget: self action: @selector(getInfo) forControlEvents:UIControlEventTouchUpInside]; 
  38.     [clearInfoButton addTarget: self action: @selector(clearInfo) forControlEvents:UIControlEventTouchUpInside]; 
  39.      
  40.  
  41. - (void)destroyEvents { 
  42.      
  43.  
  44. - (void)loadData { 
  45.     //在這里調用API,對于多個API的調用,參加后續章節 
  46.  
  47. - (void) getInfo { 
  48.     nameLabel.text = @"包小強"
  49.     ageLabel.text = @"31.6"
  50.  
  51. - (void) clearInfo { 
  52.     nameLabel.text = @""
  53.     ageLabel.text = @""
  54.  
  55. @end 

以上的代碼重構,要遵守幾個規則:

1)在createFields方法中接收從上一個頁面傳遞過來的參數

2)在createFields方法中初始化變量

3)將要操作的控件,都在ViewController中作為類級別的變量來聲明

3)在createViews方法中,加載xib文件,并通過Tag給控件一次性賦值

4)在createEvent方法中,為控件掛上事件方法,比如按鈕的點擊

5)如果有NotificationCenter,統一在createEvent方法中addObserver,在destroyEvent方法中removeObserver。

6)在DestroyFields方法中,釋放/銷毀所有引用型變量。

7)在DestroyViews方法中,釋放/銷毀所有控件。

所有的ViewController都這么寫,整個App整齊劃一。尤其是將一個頁面的所有控件一次性都從xib中根據tag值取出來,雖然浪費了一些內存,但是可以隨時隨地直接使用。

將聲明一個按鈕和為按鈕添加一個點擊事件方案分開在2個方法內寫,一開始你會非常不習慣,但是當控件多了、事件多了的時候,是一目了然的。記住,我們在做的是企業級App開發,而不是小型App。

看到最后,熟悉網站端編程的人笑了,沒錯,這種新的生命周期,就是從javascript中借鑒來的。js是一門弱語言,所以需要自定義生命周期并按部就班在不同的方法中寫不同的方法,生命周期的重新定義,或者說是擴展,只是js代碼框架中的一個小部分。

本章代碼下載:

YoungHeart-Chapter-04-1.zip (重構前)

YoungHeart-Chapter-04-2.zip   (重構后)

責任編輯:閆佳明 來源: cnblogs
相關推薦

2013-09-03 09:35:48

無線客戶端框架設計iOS

2013-09-03 09:55:42

iOS無線客戶端框架設計

2013-09-09 10:48:24

iOS無線客戶端框架設計

2013-09-16 10:43:15

無線客戶端框架設計iOSJSON

2013-09-03 09:10:56

2013-07-29 05:11:38

iOS開發iOS開發學習類的'生命周期'

2012-06-01 11:02:33

2015-07-09 15:42:48

ios應用生命周期

2009-08-10 14:31:46

ASP.NET組件設計ASP.NET控件生命

2015-07-08 16:28:23

weak生命周期

2011-03-07 13:50:20

2013-12-18 11:38:56

京東客戶生命周期大數據應用

2012-06-25 12:43:26

.NET框架

2013-03-14 10:12:54

視覺設計產品設計

2022-04-19 07:20:24

軟件開發安全生命周期SSDLC應用安全

2020-07-30 10:35:32

Java反射框架設計

2012-01-18 10:20:42

框架設計

2023-03-31 13:31:45

2012-11-28 11:05:42

IBMdW

2009-06-11 11:28:35

JSF生命周期
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一二三在线 | 手机av在线 | 亚洲精品无 | 中文字幕第100页 | 国产精产国品一二三产区视频 | 亚洲视频在线看 | 一级毛片大全免费播放 | 久久久久国产精品午夜一区 | 日韩欧美一区二区三区四区 | 国产精品视频网 | 亚洲精品欧美精品 | 欧美精品一区二区三区在线播放 | 日韩一级黄色片 | 国产精品美女久久久久久免费 | a在线视频 | 亚洲啊v在线 | 成人免费视频久久 | 久久午夜精品福利一区二区 | 少妇精品亚洲一区二区成人 | 中文字幕亚洲精品 | 中国大陆高清aⅴ毛片 | 一级片av | 久久青青| 四季久久免费一区二区三区四区 | 国产区免费视频 | 日韩精品久久久 | 欧美黑人又粗大 | 日韩国产在线观看 | 天天综合91| 欧美一级免费 | 亚洲 中文 欧美 日韩 在线观看 | 亚洲97 | 久久国产精品久久久久久久久久 | 天天干狠狠干 | 日韩在线不卡 | 欧美成人aaa级毛片在线视频 | 亚洲欧美综合精品久久成人 | 国产精品成人一区二区 | 欧美久久一区二区三区 | 欧美成人精品 | 中文字幕国产一区 |