en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

7.10.2012

在兩個不同的 Class 之間傳遞參數的方法

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 的切換(下)兩篇文章。






2 則留言:

  1. 匿名2/25/2013

    很棒的一篇文章
    非常的實用!!

    回覆刪除
    回覆
    1. 您好:

      謝謝指教。

      刪除