在數(shù)學(xué)和邏輯學(xué)中,單例定義為” 有且僅有一個元素的集合 “,在無論什么情況下,獲取到的都是同一個值。在程序中,單例模式保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。這個方法應(yīng)該是類方法,阻止所有想要生成對象的訪問,避免一個全局使用的類頻繁地創(chuàng)建和銷毀。
創(chuàng)新互聯(lián)公司專注于波密網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供波密營銷型網(wǎng)站建設(shè),波密網(wǎng)站制作、波密網(wǎng)頁設(shè)計、波密網(wǎng)站官網(wǎng)定制、成都微信小程序服務(wù),打造波密網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供波密網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
static uniqueInstance 是 Singleton 中的唯一實例, static sharedInstance 將它返回給客戶端。通常, shareInstance 會檢查 uniqueInstance 是否已經(jīng)被實例化,如果沒有,會生成一個實例然后返回 uniqueInstance 。
沒有接口,不能繼承,與單一職責(zé)原則沖突,一個類應(yīng)該只關(guān)心內(nèi)部邏輯,而不關(guān)心外面怎么樣來實例化。
只要應(yīng)用程序需要集中式的類來協(xié)調(diào)其服務(wù),這個類就應(yīng)該生成單一的實例,而不是多個實例。
代理模式:完成委托方的任務(wù),需要聲明代理對象和指定代理,相對于block,在需要傳遞參數(shù)的傳值時優(yōu)先考慮代理。
代理是一對一的關(guān)系(1個對象只能通知1個對象發(fā)生了什么事)。
應(yīng)用場景:不同類之間的傳值與回調(diào)。
觀察者模式(通知機(jī)制,KVO機(jī)制):觀察者模式本質(zhì)上是一種發(fā)布-訂閱模型,用以消除具有不同行為的對象之間的耦合,通過這一模式,不同對象可以協(xié)同工作。
通知是一對多的關(guān)系(1個通知可以發(fā)送給多個通知接受對象)。
應(yīng)用場景:監(jiān)聽設(shè)備狀態(tài),自定義鍵盤時監(jiān)聽鍵盤的彈出和隱藏。
單例模式:可以保證App在程序運行中,一個類只有唯一個實例。
系統(tǒng)中的單例:UIApplication(應(yīng)用程序?qū)嵗?、NSNotificationCenter(消息中心)、NSFileManager(文件管理)、NSUserDefaults(應(yīng)用程序設(shè)置)、NSURLCache(請求緩存)等。
應(yīng)用場景:功能集中管理的模塊可以封裝為單例,方便外界調(diào)用。
策略模式:定義了一系列的算法,并將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立于使用它的客戶而獨立變化。
MVC(Model View Controller):
model:數(shù)據(jù)層
view:視圖層,負(fù)責(zé)頁面展示
Controller:控制視圖層與數(shù)據(jù)層的關(guān)聯(lián),
MVVM(model view viewModel):
Model: 數(shù)據(jù)層,不包含邏輯
View:與用戶直接交互,只需處理觸發(fā)事件后的轉(zhuǎn)發(fā),和告訴他如何顯示
ViewModel:跟蹤view的事件,處理model層傳遞的數(shù)據(jù);公開方法、屬性,讓view保持最新的狀態(tài)
iOS開發(fā)就是為裝有iOS系統(tǒng)的設(shè)備完成應(yīng)用軟件或游戲軟件的開發(fā),ios開發(fā)的設(shè)計模式有代理模式、觀察者模式、MVC模式、單例模式、策略模式和工廠模式。
代理模式是一種消息傳遞方式,一個完整的代理模式包括:委托對象、代理對象和協(xié)議。
協(xié)議:用來指定代理雙方可以做什么,必須做什么。
委托對象:根據(jù)指定的協(xié)議,指定代理去完成什么功能。
代理對象:根據(jù)指定的協(xié)議,完成委托方需要實現(xiàn)的功能。
從上圖中可以看到三方之間的關(guān)系,在實際應(yīng)用中通過協(xié)議來規(guī)定代理雙方的行為,協(xié)議中的內(nèi)容一般都是方法列表,當(dāng)然也可以定義屬性。
協(xié)議是公共的定義,如果只是某個類使用,我們常做的就是寫在某個類中。如果是多個類都是用同一個協(xié)議,建議創(chuàng)建一個Protocol文件,在這個文件中定義協(xié)議。遵循的協(xié)議可以被繼承,例如我們常用的 UITableView ,由于繼承自 UIScrollView 的緣故,所以也將 UIScrollViewDelegate 繼承了過來,我們可以通過代理方法獲取 UITableView 偏移量等狀態(tài)參數(shù)。
協(xié)議只能定義公用的一套接口,類似于一個約束代理雙方的作用。但不能提供具體的實現(xiàn)方法,實現(xiàn)方法需要代理對象去實現(xiàn)。協(xié)議可以繼承其他協(xié)議,并且可以繼承多個協(xié)議,在iOS中對象是不支持多繼承的,而協(xié)議可以多繼承。
協(xié)議有兩個修飾符 @optional 和 @required ,創(chuàng)建一個協(xié)議如果沒有聲明,默認(rèn)是 @required 狀態(tài)的。這兩個修飾符只是約定代理是否強(qiáng)制需要遵守協(xié)議,如果 @required 狀態(tài)的方法代理沒有遵守,會報一個黃色的警告,只是起一個約束的作用,沒有其他功能。
無論是 @optional 還是 @required ,在委托方調(diào)用代理方法時都需要做一個判斷,判斷代理是否實現(xiàn)當(dāng)前方法,否則會導(dǎo)致崩潰。
在iOS中代理的本質(zhì)就是代理對象內(nèi)存的傳遞和操作,我們在委托類設(shè)置代理對象后,實際上只是用一個id類型的指針將代理對象進(jìn)行了一個弱引用。委托方讓代理方執(zhí)行操作,實際上是在委托類中向這個id類型指針指向的對象發(fā)送消息,而這個id類型指針指向的對象,就是代理對象。
通過上面這張圖我們發(fā)現(xiàn),其實委托方的代理屬性本質(zhì)上就是代理對象自身,設(shè)置委托代理就是代理屬性指針指向代理對象,相當(dāng)于代理對象只是在委托方中調(diào)用自己的方法,如果方法沒有實現(xiàn)就會導(dǎo)致崩潰。從崩潰的信息上來看,就可以看出來是代理方?jīng)]有實現(xiàn)協(xié)議中的方法導(dǎo)致的崩潰。
而協(xié)議只是一種語法,是聲明委托方中的代理屬性可以調(diào)用協(xié)議中聲明的方法,而協(xié)議中方法的實現(xiàn)還是有代理方完成,而協(xié)議方和委托方都不知道代理方有沒有完成,也不需要知道怎么完成。
由于代理對象使用強(qiáng)引用指針,引用創(chuàng)建的委托方對象,并且成為委托對象的代理。這就會導(dǎo)致委托對象的delegate屬性強(qiáng)引用代理對象,導(dǎo)致循環(huán)引用的問題,最終兩個對象都無法正常釋放。
我們將委托對象的delegate屬性,設(shè)置為弱引用屬性。
weak 和 assign 是一種“非擁有關(guān)系”的指針,通過這兩種修飾符修飾的指針變量,都不會改變被引用對象的引用計數(shù)。但是在一個對象被釋放后, weak 會自動將指針指向 nil ,而 assign 則不會。在iOS中,向 nil 發(fā)送消息時不會導(dǎo)致崩潰的,所以 assign 就會導(dǎo)致野指針的錯誤 unrecognized selector sent to instance 。
所以我們?nèi)绻揎棿韺傩裕€是用 weak 修飾,比較安全。
網(wǎng)站名稱:ios開發(fā)的設(shè)計模式,ios的設(shè)計特色
標(biāo)題路徑:http://chinadenli.net/article44/dsdseee.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、面包屑導(dǎo)航、響應(yīng)式網(wǎng)站、網(wǎng)站策劃、全網(wǎng)營銷推廣、網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)