1.bolck
1.定義block
typedef void (^btnClickBlock) (NSString*str); ?//btnClickBlock為block的名字,str為要傳的參數(shù)蕾额。
2.創(chuàng)建block類型的對(duì)象
@property (nonatomic,copy) btnClickBlock block; ? // block用copy修飾早芭。
3.通過(guò)事件對(duì)block進(jìn)行賦值。//例如按鈕點(diǎn)擊事件
- (void)btnClick:(UIButton*)sender{
if(_block) {//判斷block不為空凡简。
self.block(@"wake"); ?//@"wake" 是給block中的str賦值逼友。
}
}
4.在回調(diào)類中調(diào)用block,獲取參數(shù)的值秤涩。
secondVC.block= ^(NSString*str) { ? secondVC為創(chuàng)建定義block的類帜乞,創(chuàng)建的對(duì)象。
NSLog(@"%@",str); ? //獲取參數(shù)的值并打印筐眷。
};
2.delegate
1.定義代理
@protocol ? ? sendStringDelegate ?//定義一個(gè)協(xié)議黎烈,名為sendStringDelegate
//協(xié)議中的的方法,默認(rèn)為@required修飾屬性遵從協(xié)議的類必須實(shí)現(xiàn)匀谣,如果用@optional協(xié)議中修飾照棋,表示可選擇是否實(shí)現(xiàn)協(xié)議中的方法。
- (void)sendStringDelegate:(NSString*)str; ?
@end
2.創(chuàng)建一個(gè)帶協(xié)議的指針武翎。(用于指向代理方烈炭,所以也叫代理指針)
//在mrc中用assign修飾,在arc中用weak修飾宝恶。 assign修飾時(shí)符隙,當(dāng)對(duì)象被釋放會(huì)出現(xiàn)野指針趴捅,weak修飾,當(dāng)對(duì)象被釋放時(shí)會(huì)指向nil霹疫。而strong修飾時(shí)對(duì)象的引用計(jì)數(shù)會(huì)加1拱绑,容易出現(xiàn)循環(huán)引用。
@property (nonatomic,assign) id <sendStringDelegate> delegate;?
3.在響應(yīng)事件中使用帶協(xié)議的指針調(diào)用協(xié)議中方法丽蝎。
[self.delegatesendStringDelegate:@"wake"];
4.在代理類中創(chuàng)建代理關(guān)系猎拨,實(shí)現(xiàn)代理方法
1.加入?yún)f(xié)議頭文件
?<sendStringDelegate> (遵從協(xié)議)
2.創(chuàng)建代理關(guān)系
//firstVC為協(xié)議類創(chuàng)建的對(duì)象
//將帶協(xié)議類中帶協(xié)議的指針指向代理方
firstVC.delegate = self; ?
3.實(shí)現(xiàn)代理方法
- (void)sendStringDelegate:(NSString*)str{
NSLog(@"%@",str);
}
3.NSNotification
1.注冊(cè)通知
2.發(fā)送通知
3.在注冊(cè)通知的類中實(shí)現(xiàn)通知方法
4.在注冊(cè)通知的類中移除通知
4.kvc/kvo
KVC : 鍵值編碼,是 Key Value Coding 的簡(jiǎn)稱屠阻。
1.通途和優(yōu)點(diǎn)
無(wú)論類中的成員變量是否私有红省,都可以使用kvc來(lái)進(jìn)行賦值。
1.例如一個(gè)student類中有age和name屬性栏笆。我們可以使用下面的方法進(jìn)行屬性的賦值类腮。
[student setValue:@17 forKey:@"age"];
int b = [[student valueForKey:@"height"]intValue];
NSLog(@"age - - -%i",b);
[student setValue:@"wake" forKey:@"name"];
NSString *name = [student valueForKey:@"name"];
NSLog(@"name --- %i",name);
2.如果有上百個(gè)屬性,我們依次賦值比較麻煩蛉加,使用如下方法比較簡(jiǎn)單
NSDictionary *dict = @{
@"age" : @16,
@"name" : @"wake",
};
Student *student = [[Student alloc]init];
//把字典里的鍵值賦給 student 對(duì)象的每個(gè)屬性
[student setValuesForKeysWithDictionary:dict];
注意:用setValuesForKeysWithDictionary或者自己寫循環(huán)做字典數(shù)據(jù)轉(zhuǎn)模型數(shù)據(jù)時(shí),必須保證實(shí)體類的屬性跟字典中的key名字一一對(duì)應(yīng)缸逃,并且屬性可以比字典多针饥,但是絕對(duì)不能比字典的元素少!
如果key只寫錯(cuò)需频,編寫的時(shí)候不會(huì)報(bào)錯(cuò)丁眼,但是運(yùn)行的時(shí)候會(huì)報(bào)錯(cuò)。系統(tǒng)默認(rèn)是 crash 并報(bào)錯(cuò)昭殉,但我們可以通過(guò)重寫
//這個(gè)方法會(huì)在用 KVC 方法賦值但 key 不存在時(shí)由系統(tǒng)調(diào)用
-(void)setValue:(id)value forUndefinedKey:(NSString *)key{
NSLog(@"不存在 key:%@",key);
}
kvo NSKeyValueObserving的簡(jiǎn)稱苞七。
Key-Value Observing (簡(jiǎn)寫為KVO):當(dāng)指定的對(duì)象的屬性被修改了,允許對(duì)象接受到通知的機(jī)制挪丢。每次指定的被觀察對(duì)象的屬性被修改的時(shí)候蹂风,KVO都會(huì)自動(dòng)的去通知相應(yīng)的觀察者。KVO簡(jiǎn)而言之就是:基于鍵值的觀察者乾蓬,實(shí)際上就是觀察者模式惠啄。
1.定義model
Book類中有個(gè)price屬性
2.實(shí)例化model對(duì)象,對(duì)他的屬性進(jìn)行賦值任内,添加觀察者
book = [[Book alloc] init];? ??
? [book setValue:@46forKey:@"price"]; ? ?
?[book addObserver:self forKeyPath:@"price"options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
3.使model對(duì)象屬性發(fā)生變化
[book setValue:@20forKey:@"price"];
4.實(shí)現(xiàn)觀察者回調(diào)撵渡。
/*
*? 當(dāng)對(duì)象的屬性發(fā)生改變會(huì)調(diào)用該方法
*? @param keyPath 監(jiān)聽(tīng)的屬性
*? @param object? 監(jiān)聽(tīng)的對(duì)象
*? @param change? 新值和舊值
*? @param context 額外的數(shù)據(jù)
*/
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)objectchange:(NSDictionary *)change context:(void*)context? {
if([keyPath isEqualToString:@"price"])? ? ? {? ? ?
? ? NSLog(@"%@",[book valueForKey:@"price"]);?
?? }?
?}
5.移除觀察者
- (void)dealloc? {? ??
? [super dealloc];? ?
?? [book removeObserver:self forKeyPath:@"price"]; ? ??
?}