Model:模型
描述程序是什么,例如數(shù)據(jù)庫操作之類的行文以及紙牌Demo里紙牌玩法都是寫在Model這一層,通過Notification和KVO(后續(xù)文章會(huì)介紹)兩種方式與Controller通訊。
Controller:控制層
程序的邏輯在這里組織,Controller負(fù)責(zé)Model與View之間的溝通,因?yàn)镸odel與View老死不相往來。
當(dāng)用戶在頁面進(jìn)行操作后,Controller收集用戶發(fā)出的交互信息,然后請(qǐng)教Model如何應(yīng)對(duì),Model收到Controller提出的問題,再給出答案(Controller不提出問題,Model永遠(yuǎn)不會(huì)主動(dòng)回答)。Controller收集到Model給出的回應(yīng)之后,再根據(jù)情況去更新UI頁面。
當(dāng)把UI控件與Controller聯(lián)系起來時(shí),Controller中會(huì)出現(xiàn)對(duì)應(yīng)控件的outlet接口,通過它,Controller可以直接對(duì)UI控件進(jìn)行通訊。
View:UI頁面
程序運(yùn)行后,用戶看到的就是這一層,用戶的交互信息可以通過delegate、dataSource和Target-Action三種方式與Controller進(jìn)行通訊。

以紙牌Demo為例,右側(cè)即程序運(yùn)行后的頁面,即View層,
左側(cè)列表Model中一系列文件為Model層,定義了紙牌游戲的一系列玩法,如何玩。
CardgameViewController就是Controller層了,收集到頁面點(diǎn)擊的信息,找到Model里的方法,再去更新頁面效果。

MVC的好處就在于代碼分離,不僅使代碼結(jié)構(gòu)更清晰,也方便后續(xù)迭代更新,尤其是Controller中代碼一多,可避免在Controller這一層與UI元素設(shè)置糾纏在一起。
如圖,紙牌Demo中建立Model層以后,能夠使代碼更簡(jiǎn)潔清晰(注釋掉的為分離Model前使用的部分代碼)。


Objective-c中.h文件主要用來聲明公共接口,包括聲明類及其方法。.m文件則負(fù)責(zé)具體實(shí)現(xiàn),也可以在這定義不想暴露出去的私有接口。
引入頭文件時(shí)會(huì)看到兩種寫法,引用系統(tǒng)自帶的一般用#import <XX.h>,引用自定義的一般用#import "XX.h",區(qū)別在于""表示從當(dāng)前項(xiàng)目路徑開始尋找文件,如果找不到,則到項(xiàng)目中配置的頭文件路徑去找。<>表示直接到項(xiàng)目配置的頭文件路徑去找。
在代碼中會(huì)看到這幾個(gè)關(guān)鍵詞,使用@property聲明變量后,Xcode4.5及之后的版本中編譯器會(huì)自動(dòng)生成setter和getter方法,如果不是特殊需要,可以直接使用下劃線加變量名(“_name”)進(jìn)行賦值取值操作。
atomic是為了防止多線程操作時(shí)同時(shí)讀取數(shù)據(jù)的一種保護(hù)機(jī)制,會(huì)占用一些資源,一般在單線程中使用nonatomic即可。
strong、weak代表強(qiáng)弱引用(arc環(huán)境下使用,Xcode5以后默認(rèn)為arc環(huán)境)。
使用strong申明變量為強(qiáng)引用類型時(shí),意味著變量是對(duì)象的擁有者,除非將該變量(Objective-C中所有變量都是指針)賦值為nil或者指向其他對(duì)象,不然該對(duì)象會(huì)一直存在內(nèi)存中,即對(duì)象只要有至少一個(gè)擁有者(strong變量)時(shí),就不會(huì)被銷毀。
需要注意的是,Xcode中,不指明strong或weak時(shí),默認(rèn)為strong,但即使是strong,@property中一般也會(huì)指明strong,這是一種約定俗成習(xí)慣,雖然不寫也沒錯(cuò)。
使用weak則不同,意味著該變量不是對(duì)象的擁有者。比如在ViewController中可以發(fā)現(xiàn)UI控件一般都是weak類型,當(dāng)View這個(gè)擁有者銷毀后,UI控件就沒有擁有者了,自動(dòng)被賦值為nil,即View銷毀后,其所屬的UI控件也不存在了。

課程中建議init方法使用instancetype代替id,當(dāng)返回值與消息接收者類型一致時(shí)就可以用instancetype,能夠讓編譯器自動(dòng)做一些檢查工作,在我們寫代碼編譯階段就能自動(dòng)檢查返回值類型是否合法,但instancetype不能像id一樣作為參數(shù)使用,暫不深入研究,有興趣可以參考
http://blog.eddie.com.tw/2013/12/16/id-and-instancetype/

源碼見附件:http://files.VEVb.com/colinhou/Matchismo.zip

新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注