Objective-C 是一個物件導向語言,基於物件導向的觀念,我們不太希望一個 Class(物件)過於龐大或是做太多的事情,所以往往會依物件的觀念將一個較大的個體拆成數個較小的 Class 來做表示,最後才將它們組合,雖然說這不見得是最好的作法,卻是最容易理解與實作的一種方式。既然一個較大的個體必須被分拆成數個容易實作的小物件,那麼這些小物件彼此之間的溝通就顯得格外重要,物件得溝通在此我們可以稱作是參數傳遞,參數傳遞都必須要花費相對成本,一支好的程式,必須在溝通成本與程式複雜度之間取得良好的平衡,並且同時具有容易維護與擴展的特性,關於這類的程式設計哲理可以參考「樣式導向(Design Pattern)」的相關書籍,都會有不錯的收穫。
回到我們的主題,若要在兩個不同的 Class 之間做參數上的傳遞,可以參考以下幾種方式(方法不限於只有以下幾種):
- Key-Value Coding(KVC)
- NSNotificationCenter
- 製作 Singleton 單一物件
- NSUserDefaults 做應用程式的狀態儲存
- 為類別製作 Protocol 協定
- 透過 Storyboard Segue 取得 UIViewController 的 Instance
Key-Value Coding(KVC)
以傳遞參數來說 KVC 是我們最常使用到的方法,在你獲得另一個物件的 Instance 之後,你就可以透過 Key 值來存取所指定的 Property,例如 valueForKey: 和 setValue:forKey: 或是 valueForKeyPath: 和 setValue:forKeyPath: 方法等。
它的作用雖然等同於使用「.」符號來取得物件下的屬性,但是當我們不確定所取得物件的型態時(例如使用 id 泛用型態),這時只有使用 Key-Value Coding 方法才能正確呼叫物件內部的 setter 與 getter 方法,幫助我們存取所指定的 Property。
NSNotificationCenter
在實作上,我們可以透過 iOS SDK 內建的 NSNotificationCenter 機制來做參數上的傳遞,不過這只限於單向的訊息傳遞,NSNotificationCenter 的目的就是註冊與通知,替類別註冊一個新的事件,並實作事件發生時的處理機制,等到事件被觸發時,就可以利用這個機制來實作相關的內容,而這最常見的就是 UIKeyboard 的觸發事件,有關於 NSNotificationCenter 的相關訊息,請參考類似 Observer Pattern 的 NSNotificationCenter 一文。
製作 Singleton 單一物件
製作 Singleton 單一物件的概念,就像是宣告一個全域變數一般,只是這個全域變數現在被我們設計成一個物件,它能被所有的 Class 來做存取,或是當做 Class 與 Class 之間溝通的橋樑,你可以參考製作 Singleton 單一物件的方法一文,來學習製作 Singleton 單一物件。
NSUserDefaults 做應用程式的狀態儲存
NSUserDefaults 的作用與 Singleton 非常相似,它是為應用程式量身制定的一個專用儲存區域,就像是存檔一樣,即使在應用程式完全關閉之後,NSUserDefaults 仍然可以保留這些數值,以便下次開啟應用程式時使用,同樣 NSUserDefaults 的存在也是單一的,這樣才能保證每次都會有一致的存取結果,你可以參考應用程式內部狀態的存取與讓後台可以存取 APP 參數的方法兩篇文章,了解 NSUserDefaults 運作的方法。
為類別製作 Protocol 協定
Protocol 協定的作用是讓一個類別中的方法一到另一個類別中去實作,這可能聽起來有點抽象,例如,「當應用程式退到背景執行時我要....」,Apple 的工程師在撰寫應用程式執行狀態的 Class 時,當然不會知道應用程式退到背景執行時我要做些什麼事情,所以他只能利用 Protocol 協定,將 applicationDidEnterBackground: 方法函式放到 UIApplicationDelegate 協定中,以便日後實作。
關於 Protocol 協定的相關資訊,大家可以參考 Protocol 協定的使用方式一文。
透過 Storyboard Segue 取得 UIViewController 的 Instance
Storyboard Segue,是在 iOS SDK 5.0 才出現的新名詞,當兩個 UIViewController 在做切換時,都會透過 Segue 來達成,當然我們也可以透過 Segue 的幫助進而取得另一個 UIViewController 的 Instance,有關 Storyboard Segue 的使用方式,請參考使用 Storyboard Segue 實作 UIViewController 的切換(上)與使用 Storyboard Segue 實作 UIViewController 的切換(下)兩篇文章。
很棒的一篇文章
回覆刪除非常的實用!!
您好:
刪除謝謝指教。