1.MVC
Model:模型
描述程序是什么,例如數據庫操作之類的行文以及紙牌Demo里紙牌玩法都是寫在Model這一層,通過Notification和KVO(后續文章會介紹)兩種方式與Controller通訊。
Controller:控制層
程序的邏輯在這里組織,Controller負責Model與View之間的溝通,因為Model與View老死不相往來。
當用戶在頁面進行操作后,Controller收集用戶發出的交互信息,然后請教Model如何應對,Model收到Controller提出的問題,再給出答案(Controller不提出問題,Model永遠不會主動回答)。Controller收集到Model給出的回應之后,再根據情況去更新UI頁面。
當把UI控件與Controller聯系起來時,Controller中會出現對應控件的outlet接口,通過它,Controller可以直接對UI控件進行通訊。
View:UI頁面
程序運行后,用戶看到的就是這一層,用戶的交互信息可以通過delegate、dataSource和Target-Action三種方式與Controller進行通訊。
以紙牌Demo為例,右側即程序運行后的頁面,即View層,
左側列表Model中一系列文件為Model層,定義了紙牌游戲的一系列玩法,如何玩。
CardgameViewController就是Controller層了,收集到頁面點擊的信息,找到Model里的方法,再去更新頁面效果。
MVC的好處就在於代碼分離,不僅使代碼結構更清晰,也方便后續迭代更新,尤其是Controller中代碼一多,可避免在Controller這一層與UI元素設置糾纏在一起。
如圖,紙牌Demo中建立Model層以后,能夠使代碼更簡潔清晰(注釋掉的為分離Model前使用的部分代碼)。
2.h文件和.m文件
Objective-c中.h文件主要用來聲明公共接口,包括聲明類及其方法。.m文件則負責具體實現,也可以在這定義不想暴露出去的私有接口。
引入頭文件時會看到兩種寫法,引用系統自帶的一般用#import <XX.h>,引用自定義的一般用#import "XX.h",區別在於""表示從當前項目路徑開始尋找文件,如果找不到,則到項目中配置的頭文件路徑去找。<>表示直接到項目配置的頭文件路徑去找。
3.@property、nonatomic、strong
在代碼中會看到這幾個關鍵詞,使用@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控件也不存在了。
4.iOS7新特性 instancetype
課程中建議init方法使用instancetype代替id,當返回值與消息接收者類型一致時就可以用instancetype,能夠讓編譯器自動做一些檢查工作,在我們寫代碼編譯階段就能自動檢查返回值類型是否合法,但instancetype不能像id一樣作為參數使用,暫不深入研究,有興趣可以參考
http://blog.eddie.com.tw/2013/12/16/id-and-instancetype/
5.課程中用到的紙牌Demo最終效果
源碼見附件:http://files.cnblogs.com/colinhou/Matchismo.zip