談起設計模式,大家在興奮之余難免心生畏懼。興奮的原因是我們能夠靈活而有機地運用設計模式,這就意味著編程工作的高效性和產品健壯性、安全性的提高。很多人自豪于能夠透徹掌握“某某設計模式”,而面試官們也常常把對“某某設計模式”的掌握程度作為考評求職者的重要標準之一。設計模式的重要性和技巧性可想而知。那么,畏懼從何說起呢?設計模式是個很龐雜的知識體系,即便是同一設計模式在不同開發語言環境下也存在很大的差異,而真正能駕馭設計模式的開發者的確不多。
那么,什么是設計模式呢?設計模式是在特定場景下對特定問題的解決方案,這些解決方案是經過反復論證和測試總結出來的。實際上,除了軟件設計,設計模式也被廣泛應用于其他領域,比如UI設計和建筑設計等。
軟件設計模式大都來源于GoF的23種設計模式。該書的設計模式都是面向對象的,在C++、Java和C#領域都有廣泛的應用。Cocoa和Cocoa Touch框架中的設計模式也基本上是這23種設計模式的演變,但是具體來說,Cocoa和Cocoa Touch中的設計模式仍然存在著差異。
關于iOS開發,我們將重點分析Cocoa框架下的幾個設計模式。當然,Cocoa框架下關于設計模式的內容遠不止這些,但為了能在盡量短的時間內讓其為我所用,我們經過審慎地思考并結合多年的開發經驗,選擇了如下4種設計模式:單例模式、委托模式、觀察者模式和MVC模式.今天南昌購物商城開發公司--百恒網絡和大家一起先來了解一下單例模式。
單例模式
單例模式的作用是解決“應用中只有一個實例”的一類問題。
1.1 問題提出
在一個iOS應用的生命周期中,有時候我們只需要某個類的一個實例。例如,當應用程序啟動時,應用的狀態由 UIApplication 類的一個實例維護,這個實例代表了整個“應用程序對象”,它只能是一個實例,其作用是實現應用程序中一些共享資源的訪問和狀態的保持等。
1.2 Objective-C 實現原理
單例模式一般會封裝一個靜態屬性,并提供靜態實例的創建方法,其UML類圖如圖所示。
Objective-C實現單例設計模式類圖
實現的參考代碼如下:
其中 static Singleton *sharedManager 為靜態變量,類方為 + (Singleton*)sharedManager 。 sharedManager 方法采用了GCD(Grand Central Dispatch)技術,這是一種基于C語言的多線程訪問技術。在上述代碼中, dispatch_once函數就是由GCD提供的,它的作用是在整個應用程序生命周期中只執行一次代碼塊( ^{…} )。 dispatch_once_t 是GCD提供的結構體,使用時需要將GCD地址傳給 dispatch_once 函數。 dispatch_once 函數能夠記錄該代碼塊是否被調用過。
dispatch_once 函數不僅意味著代碼僅會被運行一次,而且還意味著此運行還是線程同步的。也就是說,當我們使用dispatch_once 函數時,就不再需要使用諸如 @synchronized 之類的語句。
1.3 Swift 實現原理
使用Swift語言實現單例設計模式的類圖如圖所示。
使用Swift語言實現單例設計模式的類圖
使用Swift語言實現的單例設計模式非常靈活,可以通過計算性替代操作(方法),還可以將屬性定義為靜態屬性。Swift單例設計模式實現的方式有很多,下面是考慮線程安全的單例模式,相關代碼如下:
上述代碼第①行中的 sharedInstance 是靜態計算屬性,通過該屬性可以獲得單例對象。第②行代碼用于定義
結構體,其中有兩個屬性—— instance 和 token ,其中第③行代碼用于定義靜態屬性 instance ,它用來保存 Singleton的子單例對象。第④行代碼定義了靜態屬性 token ,它是dispatch_once_t 類型。第⑤行代碼用于將 token 地址傳給dispatch_once 函數。 dispatch_once 函數能夠記錄該代碼是否被調用dispatch_once 函數不僅意味著代碼僅會被運行一次,而且還意味著此運行是線程同步的。
第⑥行代碼用于實例化 Singleton 對象,第⑦行代碼用于返回實例。
1.4 應用案例
在Cocoa Touch框架中,有 UIApplication 、 NSUserDefaults 和 NSNotificationCenter 等單例類。另外, NSFileManager
和 NSBundle 類雖然屬于Cocoa框架的內容,但也可以在Cocoa Touch框架中使用(Cocoa框架中的單例類有NSFileManager 、 NSWorkspace 和 NSApplication 等)。
1. UIApplication
UIApplication 類的實例提供了應用程序的集中控制點來保持應用的狀態。 UIApplication 實例總是分配給應用程序委托對象( UIApplicationDelegate ),通過應用程序委托對象來響應低內存、應用啟動、后臺運行和應用終止等事件。在HelloWorld案例中, AppDelegate 就是這個應用程序的委托對象,它實現了UIApplicationDelegate 協議。
UIApplication 類有很多方法和屬性,下面我們重點介紹其中幾個。
+ sharedApplication 方法。創建和獲得 UIApplication 實例的靜態方法。
idleTimerDisabled 屬性。設定和獲得“空閑時間禁止”的狀態。該屬性的默認值是 false ,即默認情況下系統會鎖定屏幕。當該屬性為 true 時,則不會開啟“空閑時間禁止”狀態,系統不會鎖定屏幕。開啟這項設定需要謹慎,它會使你的應用比較耗電。
- openURL :方法。可以打開一些內置的iOS應用,其中包括打開瀏覽器、打開Google地圖、撥打電話、發送短信和發送E-mail等。
打開瀏覽器的示例代碼如下:
打開Google地圖時,實際上是通過內置瀏覽器來打開的,示例代碼如下:
其中NSString 的stringByAddingPercentEscapesUsingEncoding : 方 法 將 字 符 串 轉 換 為 URL 編 碼。
如“%E6%B8%85%E5%8D%8E%E5%A4%A7%E5%AD%A6”是“清華大學”的 URL編碼。
撥打電話時,蘋果官方要求使用該方法調用內置撥號程序,示例代碼如下:
發送短信時,蘋果官方要求使用該方法調用內置發送短信程序,示例代碼如下:
發送E-mail時,這種方式可以發送簡單的不帶附件的E-mail,示例代碼如下:
2. NSUserDefaults
單例類 NSUserDefaults 可以很方便地讀取應用設置項目。 + standardUserDefaults 方法是創建和獲得NSUserDefaults 實例的靜態方法。
3. NSNotificationCenter
單例類 NSNotificationCenter 提供信息廣播通知,它采用觀察者模式的通知機制。 + defaultCenter 方法是創建和獲得 NSNotificationCenter 實例的共享方法。
4. NSFileManager
NSFileManager 提供了訪問文件系統的通用操作,可以定位、創建、復制文件和文件夾。在iOS 5和Mac OS Xv10.7之后,它還可以管理存儲在iCloud上的數據。 + defaultManager 方法是創建和獲得 NSFileManager 實例的方法。
5. NSBundle
NSBundle 提供了動態加載(或卸載)可執行代碼、定位資源文件、資源本地化和訪問文件系統等功能+mainBundle 方法是創建和獲得 NSBundle 實例的共享方法。
本文僅限內部技術人員學習交流,不得作于其他商業用途.希望此文對廣大技人員有所幫助。文章出自:南昌購物商城開發公司-百恒網絡