MVC
MVC, Model, View, Controller
是一種將應(yīng)用中所有類組織起來的策略
將所有的類分為三塊,分別是模型、視圖和控制器
Model, View, Controller
-
Model
What your app is(but not how it is displayed)
完全獨立于 UI
-
View
controller's minions
控制器要使用的類,視圖中的元素是通用的
視圖不允許擁有數(shù)據(jù),模型擁有數(shù)據(jù)
-
Controller
How your Model presented to the user(UI logic)
控制 UI 如何工作,非常特定地作用于 UI 工作
通信
-
控制器 -> 模型
控制器需要知道模型的一切,需要有同模型完全通信的能力,按照任何方式使用 API
控制器的作用是將模型呈現(xiàn)給用戶,使用視圖作為其仆從
控制器需要能夠完全,不受限地訪問模型
-
控制器 -> 視圖
通信同樣是不受限的
當(dāng)有一個屬性從控制器指向視圖,就稱它是一個 outlet,作用是讓視圖和控制器通信
-
模型 <-> 視圖
無法通信,模型完全獨立于 UI
視圖是通用的 UI 對象,不能與任何特定模型通信
視圖需要控制器來為它解釋模型
-
視圖 -> 控制器
- 通過盲通信(target action 等)
- 通過代理
- 通過數(shù)據(jù)源
-
模型 -> 控制器
不允許,模型對 UI 一無所知
模型中的事物變化時,控制器需要知道這樣的變化——通過 Notification 機制和鍵值觀察
屬性
屬性是 OBJC 中用來訪問實例變量的方式
屬性實際上就是一個 getter 方法和一個 setter 方法(并不會對性能有太大影響)
類
每個類有一個頭文件.h 和一個實現(xiàn)文件.m
.h 里的是公共 API
.m 里的是私有 API
-
.h
@import Foundation @interface Card: NSObject //@interface <類名(同文件名)> : <父類> //.h 必須指名父類,且只指名一次 @property (strong, nonatomic) NSString *contents; //@property 會聲明每一個紙牌實例都需要空間,且在 .h 中自動創(chuàng)建 setter 和 getter 的聲明 //對象聲明必須使用指針。所有的對象在堆中而不是棧中 //strong 表示在堆中保持這個這個所指的東西,除非沒有任何一個強指針指向它則釋放(這稱為 ARC),是缺省值 //weak 表示除了有 strong 的特性以外,當(dāng)它被釋放時這個指針會指向 nil(對 nil 指針發(fā)送消息不會有問題) //nonatomic 非原子性,即禁止多線程 @property (nonatomic, getter=isChosen) BOOL chosen; @property (nonatomic, getter=isMathced) BOOL matched; //原始屬性不再堆中,不需要指針,所以不用指定 strong 或 weak //可以在聲明時修改 Getter 的名字 - (int)match:(Card *)card; //- 表示實例方法,+ 表示類方法 @end //表示接口的結(jié)束,所有的共有 API 都在 @interface 和 @end 之間
-
.m
#import "Card.h" @interface Card() @end //私有聲明部分 以 @interface <類名>() 開始,@end 結(jié)束 //主要用于屬性 @implementation Card @synthesize contents = _contents //@synthesize 與 @property 成對使用,表示使用名為_contents 的實例變量 //iOS7以后可以不用寫,默認(rèn)生成前綴是下劃線的實例變量和對應(yīng) setter 和 getter //@synthesize 會在 .m 中自動生成 setter 和 getter 的實現(xiàn) //如果有自己實現(xiàn)的 setter 和 getter ,上面的自動實現(xiàn)會被屏蔽 - (int)match:(NSArray *)otherCards { int score = 0; for (Card *card in otherCards) { if ([!card.contents isEqualToString:self.contents]) { score = 1; //==比較的是指針而不是值,要用 isEqualToString } } } @end //表示私有實現(xiàn)的結(jié)束,所有私有實現(xiàn)都在 @implementation 和 @end 之間