1. 程式人生 > >【IOS】分鏡和nib檔案的差別

【IOS】分鏡和nib檔案的差別

摘選自 【精通IOS開發】

nib 檔案實際上是靜態物件圖。當向執行中的應用載入nib 時,它所包含的物件全都會載入並且一直存在,包括nib檔案中指定的所有連線。系統將依次為nib檔案中的每個單獨物件建立一個全新的例項,以及關聯所有的輸出介面和物件。

  分鏡中的每個場景大致上都是相應的nib 檔案。當添加了元資料以描述場景如何通過轉場互相關聯之後,就得到一個分鏡。一個複雜的分鏡通常不會一次載入所有的內容。相反,任何使新場景獲得焦點的行為都會導致分鏡停止載入特定場景的靜態物件圖。也就是說在使用分鏡識看到的物件並不一定同時都存在。

   由於介面構建器不知道哪些場景將會共存,所以它其實禁止你從一個場景中的物件向另一個場景中的物件關聯任何輸出介面或者目標/操作。事實上能夠在不同場景之間進行關聯的只有轉場。

  NIB 檔案載入流程 轉自【http://edsioon.me/nib-load-process/】

Nib檔案是儲存由Interface Builder建立的物件及物件間關係的一種資源文件。Nib檔案中的物件包括:介面物件(視覺化物件–視窗,檢視,控制元件,選單等;非視覺化物件–視窗控制器,檢視控制器,程式委託代理等)和佔位符物件(File’s Owner,First  Responder,Application)。它描述了物件,以及物件間的關係。物件間的關係包括:連線Nib檔案的所有者-File’s Owner,屬性例項變數繫結,動作方法繫結和委託繫結。當Nib檔案被載入後,介面物件被建立,佔位符物件並不會被建立。應該在你的程式碼中建立此佔位符物件,並把它傳遞給nib的載入程式碼。

1、將Nib檔案內容與相關資源載入到記憶體

  • 將全部的Nib物件圖(object graph)的原始資料載入到記憶體,但是資料是序列化(unarchived)的。
  • 將所有與Nib檔案相關的自定義圖片資源載入到記憶體,且被新增到Cocoa image cache。
  • 將所有與Nib檔案相關的聲音資源載入到記憶體,且被新增到Cocoa sound cache。

2、反序列化Nib物件圖資料,初始化物件。每個新物件如何初始化取決於物件型別以及序列化的方式。

  • 通常情況下,物件通過initWithCoder:初始化。在iOS中,任何服從NSCoding協議的物件都通過initWithCoder方法初始化。這包括UIView和UIViewController的所有的子類,無論Xcode庫的預設類還是自定義類。
  • OS X中自定義View通過initWithFrame:初始化,但是iOS中不使用此方法初始化自定義類
  • 其他自定義物件,通過init方法進行初始化。

3、重建Nib中物件的所有的聯絡(action、outlet),包括與File’s Owner與其他佔位物件的聯絡

  • outlet connections:在iOS中,nib載入程式碼利用setValue:forKey:重新連線outlet。在iOS中設定一個outlet會對所有的註冊觀察者傳送一個KVO通知,這些通知有可能在所有的物件聯絡重建之前發出,並且肯定會發生在物件的任一awakeFromNib被呼叫之前。
  • action connections:在iOS中,nib載入程式碼會呼叫UIControl的addTarget:action:forControlEvents:方法來設定action。如果target引數為nil,action會由responder chain處理。

4、向Nib中相應的物件傳送awakeFromNib訊息。在iOS中,此訊息僅傳送給由nib載入程式碼初始化的物件,File’s Owner、First Responser、任一佔位物件都接收不到awakeFromNib訊息。

5、顯示那些可見屬性為YES的物件。

總結

  1. 載入Nib檔案->建立物件alloc->初始化init->建立物件間的連線->向建立的物件傳送awakeFromNib訊息。
  2. 在執行初始化init方法期間,所有的IBOutlet例項變數都為nil,只有建立了nib檔案中的所有物件(包括視窗、文字編輯框、按鈕…),所有連線才算完成。
  3.  一旦建立了所有的連線(即物件地址連線到例項變數),會向所有的物件傳送訊息awakeFromNib。在awakeFromNib方法中,例項變數已連線,例項變數有效。