Model:模型數據庫
描述程序是什麼,例如數據庫操做之類的行文以及紙牌Demo裏紙牌玩法都是寫在Model這一層,經過Notification和KVO(後續文章會介紹)兩種方式與Controller通信。多線程
Controller:控制層atom
程序的邏輯在這裏組織,Controller負責Model與View之間的溝通,由於Model與View老死不相往來。spa
當用戶在頁面進行操做後,Controller收集用戶發出的交互信息,而後請教Model如何應對,Model收到Controller提出的問題,再給出答案(Controller不提出問題,Model永遠不會主動回答)。Controller收集到Model給出的迴應以後,再根據狀況去更新UI頁面。線程
當把UI控件與Controller聯繫起來時,Controller中會出現對應控件的outlet接口,經過它,Controller能夠直接對UI控件進行通信。3d
View:UI頁面指針
程序運行後,用戶看到的就是這一層,用戶的交互信息能夠經過delegate、dataSource和Target-Action三種方式與Controller進行通信。code
以紙牌Demo爲例,右側即程序運行後的頁面,即View層,對象
左側列表Model中一系列文件爲Model層,定義了紙牌遊戲的一系列玩法,如何玩。blog
CardgameViewController就是Controller層了,收集到頁面點擊的信息,找到Model裏的方法,再去更新頁面效果。
MVC的好處就在於代碼分離,不只使代碼結構更清晰,也方便後續迭代更新,尤爲是Controller中代碼一多,可避免在Controller這一層與UI元素設置糾纏在一塊兒。
如圖,紙牌Demo中創建Model層之後,可以使代碼更簡潔清晰(註釋掉的爲分離Model前使用的部分代碼)。
Objective-c中.h文件主要用來聲明公共接口,包括聲明類及其方法。.m文件則負責具體實現,也能夠在這定義不想暴露出去的私有接口。
引入頭文件時會看到兩種寫法,引用系統自帶的通常用#import <XX.h>,引用自定義的通常用#import "XX.h",區別在於""表示從當前項目路徑開始尋找文件,若是找不到,則到項目中配置的頭文件路徑去找。<>表示直接到項目配置的頭文件路徑去找。
在代碼中會看到這幾個關鍵詞,使用@property聲明變量後,Xcode4.5及以後的版本中編譯器會自動生成setter和getter方法,若是不是特殊須要,能夠直接使用下劃線加變量名(「_name」)進行賦值取值操做。
atomic是爲了防止多線程操做時同時讀取數據的一種保護機制,會佔用一些資源,通常在單線程中使用nonatomic便可。
strong、weak表明強弱引用(arc環境下使用,Xcode5之後默認爲arc環境)。
使用strong申明變量爲強引用類型時,意味着變量是對象的擁有者,除非將該變量(Objective-C中全部變量都是指針)賦值爲nil或者指向其餘對象,否則該對象會一直存在內存中,即對象只要有至少一個擁有者(strong變量)時,就不會被銷燬。
須要注意的是,Xcode中,不指明strong或weak時,默認爲strong,但即便是strong,@property中通常也會指明strong,這是一種約定俗成習慣,雖然不寫也沒錯。
使用weak則不一樣,意味着該變量不是對象的擁有者。好比在ViewController中能夠發現UI控件通常都是weak類型,當View這個擁有者銷燬後,UI控件就沒有擁有者了,自動被賦值爲nil,即View銷燬後,其所屬的UI控件也不存在了。
課程中建議init方法使用instancetype代替id,當返回值與消息接收者類型一致時就能夠用instancetype,可以讓編譯器自動作一些檢查工做,在咱們寫代碼編譯階段就能自動檢查返回值類型是否合法,但instancetype不能像id同樣做爲參數使用,暫不深刻研究,有興趣能夠參考
http://blog.eddie.com.tw/2013/12/16/id-and-instancetype/
源碼見附件:http://files.cnblogs.com/colinhou/Matchismo.zip