1. KVO
KeyValueObseving(鍵值監(jiān)聽)
提供了觀察某一屬性變化的方法。當(dāng)某個對象的屬性發(fā)生改變的時候(用KVO監(jiān)聽)
[person addObsever:(nonnull NSObject *) forkeyPath:(nonnull NSObject *)?
? options:(NSkeyValueObseveingOptions) content:(nullable void *)];
但KVO的性能不好稍计,底層會動態(tài)產(chǎn)生新的類
一個對象的屬性能被多個對象監(jiān)聽裕循,一個對象能夠監(jiān)聽多個對象的其他屬性
作用:
給對象綁定一個監(jiān)聽器(觀察者)
- observer 觀察者
- keyPath 要監(jiān)聽的屬性
- options 選項(方法中拿到屬性值)
2.KVC
KeyValueCoding(鍵值編碼)
person.name = @"張三";
? or
[person setValue:@“張三” forkey:@“name”];
利用KVC可以進行簡單的賦值
利用KVC修改類的私有成員變量
3.delegate
把某個對象要做的事情委托給別的對象去做。那么別的對象就是這個對象的代理硅则,代替它來打理要做的事株婴。反映到程序中,首先要明確一個對象的委托方是哪個對象困介,委托所做的內(nèi)容又是什么。
4.通知中心
NSNotification-比較靈活
一個通知能被多個對象接收徒扶,一個對象能夠接收多個通知
通知的三個屬性:
@property (readonly, copy) NSString *name; //名稱
@property (nullable, readonly, retain) id object; //發(fā)布者
@property (nullable, readonly, copy) NSDictionary *userInfo; //額外信息
初始化(可以理解為創(chuàng)建)一個通知(NSNotification)對象只有通知的的名稱和通知的發(fā)布者
+ (instancetype)notificationWithName:(NSString *)aName object:(id)anObject;?
+ (instancetype)notificationWithName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;?
- (instancetype)initWithName:(NSString *)name object:(id)object userInfo:(NSDictionary *)userInfo;
a).首先八回,在需要接收通知的地方注冊觀察者,比如
? ?//獲取通知中心單例對象
? ? ?NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
? ?//添加當(dāng)前類對象為一個觀察者溶浴,name和object設(shè)置為nil管引,表示接收一切 通知
? ? [center addObserver:self selector:@selector(notice:) name:@"aha" ?object:nil];?
b).然后,在我們需要時發(fā)送通知消息
? ? //創(chuàng)建消息對象
? ? ?NSNotification *notification = [[NSNotification alloc]initWithName:@"aha" object:@"hah" userInfo:@{@"我是消息":@"hello"}];
? ? //使用通知中心發(fā)送通知
? ? [[NSNotificationCenter defaultCenter]postNotification:notification];
c).執(zhí)行通知方法
1谅将、發(fā)布一個notification通知重慢,可在notification對象中設(shè)置通知的名稱、通知發(fā)布者隅熙、額外信息等
- (void)notice:(NSNotification *)notification{}
2、發(fā)布一個名稱為aName的通知囚戚,anOject為這個通知的發(fā)布者
- (void)postNotificationName:(NSString *)aName object:(id)anOject{}
3、發(fā)布一個名稱為aName的通知匾二,anObject為這個通知的發(fā)布者拳芙,aUserInfo為額外信息
- (void)postNotificationName:(NSString *)aName object:(id)anOject?userInfo:(NSDictionary*)aUserInfo{}
d).移除通知
通知中心不會保留監(jiān)聽器對象,在通知中心注冊過的對象转培,必須在該對象注釋前移除通知浆竭。否則,當(dāng)相應(yīng)的通知再次出現(xiàn)時邦泄,通知中心仍然會向該監(jiān)聽器發(fā)送消息。因為相應(yīng)的監(jiān)聽器對象已經(jīng)被釋放了肌索,所以可能會導(dǎo)致應(yīng)用崩潰
通知中心提供了相應(yīng)的方法來取消注冊監(jiān)聽器
- (void)removeObserver:(id)observer;
- (void)removeObserver:(id)observer name:(NSString*)aName object:(id)anObject;
一般在監(jiān)聽器銷毀之前取消注冊(如在監(jiān)聽器中加入下列代碼):
- (void)dealloc {
? ? //[super dealloc];?非ARC中需要調(diào)用此句
??? [[NSNotificationCenterdefaultCenter]removeObserver:self];
}
5.MVC
創(chuàng)建model類
找到Cocoa Touch Class诚亚,繼承自NSObject
在聲明屬性的時候午乓,不要在這里聲明UIKit框架里的東西,因為model與view本身沒有關(guān)聯(lián)
字符串一般用copy
6.單例
單例模式是一種常用的軟件設(shè)計模式梢灭。在它的核心結(jié)構(gòu)中只包含一個被稱為單例的特殊類蒸其。通過單例模式可以保證系統(tǒng)中一個類只有一個實例
7.Block
block作用:block是對象,它封裝了一段代碼钥顽,這段代碼可以在任何時候執(zhí)行靠汁。block可以作為函數(shù)參數(shù)或者函數(shù)的返回值湿蛔,而其本身又可以帶輸入?yún)?shù)或返回值县爬。它和傳統(tǒng)的函數(shù)指針很類似添谊,但是有區(qū)別:block是inline的,并且它對局部變量是只讀的斩狱。
block分為聲明、定義泌枪、類型秕岛、調(diào)用
1).block聲明:返回值(^block變量名)(參數(shù))
即,void(^block)()修壕;
2).block定義:三種方式 = ^(參數(shù)){ ?}遏考;
第一種:最常用
? ? ? ? ? ? void(^block1)= ^( ){?
? ? ? ? ? ? NSLog(@"調(diào)用了block1");
? ? ? ? ? ? };
第二種:如果沒有參數(shù)灌具,參數(shù)可以隱藏。如果有參數(shù)督笆,定義的時候截歉,必須要寫參數(shù),?
? ? ? ? ? ? 而且要寫參數(shù)的變量名
? ? ? ? ? ? void(^block2)= ^ { ?}瘪松;//無參
? ? ? ? ? ? void(^block2)(int)= ^(int a) {? }宵睦; //有參
第三種:block返回可以省略,不管有沒有返回值壳嚎,都沒有省略
? ? ? ? ? ? int(^block3)= ^ (int){?
? ? ? ? ? ? return 3末早;
? ? ? ? ? ? }说庭;
3).block類型:int(^)(NSString *)
? ? ? ? ? ? ?int(^block4)(NSString *)= ^(NSString *name) {??
? ? ? ? ? ? ?return 2;?
? ? ? ? ? ? ?};
4).block調(diào)用:
block1()姿搜;