希岛爱理av免费一区二区,成人性教育av免费网址,欧美7777,在线免费日韩片

十年專注于品牌網站建設 十余年專注于網站建設_小程序開發_APP開發,低調、敢創新、有情懷!
南昌百恒網絡微信公眾號 掃一掃關注
小程序
tel-icon全國服務熱線:400-680-9298,0791-88117053
掃一掃關注百恒網絡微信公眾號
掃一掃打開百恒網絡微信小程序

百恒網絡

南昌百恒網絡

iOS常用設計模式

百恒網絡 2017-03-27 4658

談起設計模式,大家在興奮之余難免心生畏懼。興奮的原因是我們能夠靈活而有機地運用設計模式,這就意味著編程工作的高效性和產品健壯性、安全性的提高。很多人自豪于能夠透徹掌握“某某設計模式”,而面試官們也常常把對“某某設計模式”的掌握程度作為考評求職者的重要標準之一。設計模式的重要性和技巧性可想而知。那么,畏懼從何說起呢?設計模式是個很龐雜的知識體系,即便是同一設計模式在不同開發語言環境下也存在很大的差異,而真正能駕馭設計模式的開發者的確不多。

那么,什么是設計模式呢?設計模式是在特定場景下對特定問題的解決方案,這些解決方案是經過反復論證和測試總結出來的。實際上,除了軟件設計,設計模式也被廣泛應用于其他領域,比如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實現單例設計模式類圖

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語言實現的單例設計模式非常靈活,可以通過計算性替代操作(方法),還可以將屬性定義為靜態屬性。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地圖時,實際上是通過內置瀏覽器來打開的,示例代碼如下:

用瀏覽器打開Google地圖時顯示的代碼

其中NSString 的stringByAddingPercentEscapesUsingEncoding : 方 法 將 字 符 串 轉 換 為 URL 編 碼。

如“%E6%B8%85%E5%8D%8E%E5%A4%A7%E5%AD%A6”是“清華大學”的 URL編碼。

撥打電話時,蘋果官方要求使用該方法調用內置撥號程序,示例代碼如下:

撥打電話時,蘋果官方要求使用該方法調用內置撥號程序,示例代碼

發送短信時,蘋果官方要求使用該方法調用內置發送短信程序,示例代碼如下:

發送短信時,蘋果官方要求使用該方法調用內置發送短信程序,示例代碼

發送E-mail時,這種方式可以發送簡單的不帶附件的E-mail,示例代碼如下:

發送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 實例的共享方法。

本文僅限內部技術人員學習交流,不得作于其他商業用途.希望此文對廣大技人員有所幫助。文章出自:南昌購物商城開發公司-百恒網絡

400-680-9298,0791-88117053
掃一掃關注百恒網絡微信公眾號
掃一掃打開百恒網絡小程序

歡迎您的光顧,我們將竭誠為您服務×

售前咨詢 售前咨詢
 
售前咨詢 售前咨詢
 
售前咨詢 售前咨詢
 
售前咨詢 售前咨詢
 
售前咨詢 售前咨詢
 
售后服務 售后服務
 
售后服務 售后服務
 
備案專線 備案專線
 
×
主站蜘蛛池模板: 易门县| 辽阳县| 元朗区| 囊谦县| 翁牛特旗| 南宫市| 大宁县| 土默特左旗| 哈尔滨市| 郯城县| 珠海市| 江孜县| 洪湖市| 沾益县| 全南县| 保康县| 陇西县| 台东市| 平乐县| 和林格尔县| 尚义县| 南平市| 英山县| 平陆县| 泰兴市| 迁西县| 运城市| 泰来县| 祁东县| 深水埗区| 乌鲁木齐县| 沐川县| 华蓥市| 开封市| 阳泉市| 柯坪县| 靖西县| 乌兰察布市| 镇平县| 呼玛县| 会理县|