1.MVC設(shè)計(jì)模式:
MVC設(shè)計(jì)模式主要有三個(gè)部分,數(shù)據(jù)模型類(model)、視圖(view)、控制器(viewController)將應(yīng)用程序進(jìn)行邏輯劃分。優(yōu)勢(shì)是減少程序的耦合性,層次清晰,職責(zé)分明,易于維護(hù)。
其中各個(gè)部分的職責(zé):
數(shù)據(jù)模型:封裝了應(yīng)用程序的數(shù)據(jù),并定義操控和處理數(shù)據(jù)的邏輯和運(yùn)算,例如服務(wù)器傳遞過(guò)來(lái)的數(shù)據(jù),主要是在該層進(jìn)行操作。用戶在視圖層中所進(jìn)行的創(chuàng)建或者修改數(shù)據(jù)的操作通過(guò)控制器,最終引起模型對(duì)象的創(chuàng)建或者更新,模型對(duì)象更新后,他會(huì)通過(guò)控制器來(lái)更新相應(yīng)的數(shù)據(jù)對(duì)象。
視圖:視圖對(duì)象是應(yīng)用程序中用戶看的見(jiàn)的、可以操作的對(duì)象。視圖對(duì)象知道如何將自己繪制出來(lái),并可能對(duì)用戶的操作作出響應(yīng),視圖對(duì)象的主要目的就是現(xiàn)實(shí)來(lái)自應(yīng)用程序模型對(duì)象的數(shù)據(jù),并使該數(shù)據(jù)可被編輯。雖然視圖和模型對(duì)象息息相關(guān),但是二者之間不能通信,只能通過(guò)控制器來(lái)進(jìn)行交互。在iOS中,所有的控件、視圖都繼承自UIView,他只負(fù)責(zé)顯示、相應(yīng)用戶的操作,而UIview所產(chǎn)生的事件都可以采用委托的方式,交給控制器來(lái)實(shí)現(xiàn)
控制器:控制器是在模型和視圖中間充當(dāng)中介的作用,通過(guò)它,視圖對(duì)象了解了模型對(duì)象的更改,模型對(duì)象也通過(guò)它了解視圖的所發(fā)生的事情,從而更新或者創(chuàng)建新的模型??刂破鲗?duì)象還可以為應(yīng)用程序執(zhí)行設(shè)置和協(xié)調(diào)任務(wù),并管理其他對(duì)象的聲明周期。當(dāng)控制器了解到視圖對(duì)象中用戶的操作,將此操作所產(chǎn)生的新的數(shù)據(jù)或者更新的數(shù)據(jù)傳遞給模型。當(dāng)控制器了解到模型層有變化之后,將新的模型對(duì)象傳遞給視圖,以便視圖在適當(dāng)?shù)臅r(shí)候顯示。
小結(jié):1、M和V之間一定不能直接的通信,必須通過(guò)控制器來(lái)傳遞:2、M與C可以直接通信,M通過(guò)通知或者KVO與控制器通信;3、C也可以直接與V通信,每個(gè)C都會(huì)帶有一個(gè)view,通過(guò)outlet,直接操作view,outlet直接對(duì)應(yīng)到view中的控件,view通過(guò)action向C報(bào)告事件,C是V的數(shù)據(jù)源
2.單例模式:
單例模式可以確保對(duì)于一個(gè)給定的類只有各異實(shí)例存在,這個(gè)實(shí)例有一個(gè)全局唯一的訪問(wèn)點(diǎn),它通常使用懶加載的方式,在第一次用到的時(shí)候再去創(chuàng)建。
3、代理模式:
因?yàn)镺bject-C是不支持多繼承的,所以很多時(shí)候都是用Protocol(協(xié)議)來(lái)代替。Protocol(協(xié)議)只能定義公用的一套接口,但不能提供具體的實(shí)現(xiàn)方法。也就是說(shuō),它只告訴你要做什么,但具體怎么做,它不關(guān)心。
Protocol(協(xié)議)的作用:
定義一套公用的接口(Public)
@required:必須實(shí)現(xiàn)的方法
@optional:可選 實(shí)現(xiàn)的方法(可以全部都不實(shí)現(xiàn))
委托代理(Delegate)傳值:
它本身是一個(gè)設(shè)計(jì)模式,它的意思是委托別人去做某事。
比如:兩個(gè)類之間的傳值,類A調(diào)用類B的方法,類B在執(zhí)行過(guò)程中遇到問(wèn)題通知類A,這時(shí)候我們需要用到代理(Delegate)。
又比如:控制器(Controller)與控制器(Controller)之間的傳值,從C1跳轉(zhuǎn)到C2,再?gòu)腃2返回到C1時(shí)需要通知C1更新UI或者是做其它的事情,這時(shí)候我們就用到了代理(Delegate)傳值。
代理的使用步驟大致如下
用一個(gè)協(xié)議來(lái)約束另一個(gè)對(duì)象中的方法,以此保證從一個(gè)對(duì)象到另一個(gè)對(duì)象的消息的傳遞過(guò)程,叫做代理模式
情景:一個(gè)對(duì)象想給另一個(gè)對(duì)象發(fā)消息
委托方(B控制器,負(fù)責(zé)接收數(shù)據(jù))
代理方(A控制器,負(fù)責(zé)顯示委托方發(fā)來(lái)的消息)
委托方:
1》定義協(xié)議
2》增加一個(gè)屬性,存儲(chǔ)代理對(duì)象的引用
3》在合適的時(shí)機(jī),給代理發(fā)消息
代理方:
1》遵守協(xié)議
2》實(shí)現(xiàn)方法
3》將自己設(shè)置為代理方(將自己的引用給B傳過(guò)去)
4、通知中心
使用通知中心的方式可以不用設(shè)置代理,但是需要設(shè)置觀察者,使用之后還要移除觀察者。首先需要在接收通知的地方注冊(cè)觀察者。
5、Block
是OC提供的一種運(yùn)行時(shí)方法機(jī)制,類似于Java的匿名函數(shù),他提供了一種運(yùn)行時(shí)的臨時(shí)回調(diào)機(jī)制。
三者之間的區(qū)別
1)代理針對(duì)的是一對(duì)一的關(guān)系,并且接收方可以返回值給發(fā)送方,代理的邏輯結(jié)構(gòu)清晰,實(shí)現(xiàn)起來(lái)較為簡(jiǎn)單,聲明協(xié)議、設(shè)置代理屬性(為了避免循環(huán)引用,設(shè)置代理屬性的時(shí)候通常用weak修飾)設(shè)定方法,最后在想要代理所做的事情的方法中調(diào)用即可。需要注意的是:創(chuàng)建協(xié)議的時(shí)候必須實(shí)現(xiàn)的方法用@require修飾,可選的方法使用@optional來(lái)修飾。
2)通知:通知是一對(duì)多的形式,只要是注冊(cè)了該通知的對(duì)象,都可以接受消息。他的實(shí)現(xiàn)較為復(fù)雜,注冊(cè)通知、發(fā)出通知,接受消息。當(dāng)自己定義通知的時(shí)候,需要定義一個(gè)key來(lái)給通知命名,當(dāng)接收通知的時(shí)候,這個(gè)key拼寫(xiě)錯(cuò)誤的話就無(wú)法接受通知,通常使用宏的方式來(lái)避免這個(gè)問(wèn)題。注冊(cè)的通知中心需要手動(dòng)的移除。
3)block是目前開(kāi)發(fā)較為常用的一種方式,功能比較強(qiáng)大。最大的特點(diǎn)就是回調(diào),回到的時(shí)候可以傳入?yún)?shù),最重要的是,無(wú)論在哪里嗲用,block的執(zhí)行都會(huì)回到block創(chuàng)建的地方執(zhí)行,而非調(diào)用的地方。