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

      百恒網絡

      南昌百恒網絡

      iOS常用設計模式

      百恒網絡 2017-03-27 4746

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

      那么,什么是設計模式呢?設計模式是在特定場景下對特定問題的解決方案,這些解決方案是經過反復論證和測試總結出來的。實際上,除了軟件設計,設計模式也被廣泛應用于其他領域,比如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
      掃一掃關注百恒網絡微信公眾號
      掃一掃打開百恒網絡小程序

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

      售前咨詢 售前咨詢
       
      售前咨詢 售前咨詢
       
      售前咨詢 售前咨詢
       
      售前咨詢 售前咨詢
       
      售前咨詢 售前咨詢
       
      售后服務 售后服務
       
      售后服務 售后服務
       
      備案專線 備案專線
       
      ×
      永久免费无码日韩视频| 国产精品免费精品自在线观看| 日韩精品一区二区三区中文字幕 | 日韩在线视频观看| 亚洲午夜精品在线| 国产精品自产拍2021在线观看| 国产精品看高国产精品不卡| 国产精品香蕉一区二区三区| 亚洲日韩人妻第一页| 丰满人妻熟妇乱又伦精品视| 久久久久久久精品妇女99| 国产午夜福利久久精品| 国内少妇人妻偷人精品xxx| 亚洲精品无码成人片久久不卡| 日韩免费视频播放| 51精品视频免费国产专区| 国产精品国产三级国快看| 国产精品亚洲专区无码WEB| 国内精品乱码卡1卡2卡3免费| 精品无人区一区二区三区在线| 91精品全国免费观看含羞草| 99久热只有精品视频免费观看17| 久久精品国产清白在天天线 | 亚洲国产精品综合福利专区| 99RE久久精品国产| 久久亚洲国产成人精品性色| 久久精品人人槡人妻人人玩| 麻豆精品久久精品色综合| 精品九九久久国内精品| 亚洲精品成人无码中文毛片不卡| 中文字幕久久精品| 在线精品亚洲一区二区小说| 国产乱人伦偷精品视频免下载| 亚洲精品狼友在线播放| 亚洲精品国精品久久99热一| 久久精品国产亚洲一区二区| 国产精品露脸国语对白| 日韩一区精品视频一区二区| 99国产精品视频免费观看| 中文字幕亚洲精品资源网| 久久精品久噜噜噜久久|