KVC/KVO 使用细节和调用顺序
生活随笔
收集整理的這篇文章主要介紹了
KVC/KVO 使用细节和调用顺序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Key-Value Coding (KVC) Key-Value Coding (KVC) KVC,即是指 NSKeyValueCoding,一個非正式的 Protocol,提供一種機制來間接訪問對象的屬性。KVO 就是基于 KVC 實現的關鍵技術之一。 一個對象擁有某些屬性。比如說,一個 Person 對象有一個 name 和一個 address 屬性。以 KVC 說法,Person 對象分別有一個 value 對應他的 name 和 address 的 key。 key 只是一個字符串,它對應的值可以是任意類型的對象。從最基礎的層次上看,KVC 有兩個方法:一個是設置 key 的值,另一個是獲取 key 的值。 // 重寫setter方法和getter 方法: 1. Dog對象有屬性: @property(nonatomic,copy)NSString?*name; 2. 如果同時重寫setter和getter方法: // 記住: 如果同時重寫setter和getter方法,系統不會自動生成_name的成員變量. 需要??@synthesize?name =?_name; 以告訴系統,你要幫我生成_name? 3.??[myDog?setValue:@"MBXxx"?forKey:@"_name"]; @“_name” @“name”?都可以訪問到該成員變量 4.??NSString?*age = [myDog?valueForKey:@"age"]; 調用這句代碼時, 1) 系統先去找該變量有沒有getter方法. 如果有,調用getter方法取值 2) 如果沒有getter方法,系統會查找有沒有age成員或者_age成員. 5. 如果僅僅在.m文件中聲明了全局的變量: {
????@public NSString?*age; } 這時,只能通過KVC模式來賦值和取值. // 注: 先賦值,再取. [myDog?setValue:@"10"?forKey:@"age"];
????????NSString?*age = [myDog?valueForKey:@"age"]; NSLog(@"age ==== %@",age); 打印結果: age === 10 說明,賦值和取值過程成功.
KVO: 即:Key-Value Observing,它提供一種機制,當指定的對象的屬性被修改后,則對象就會接受到通知。簡單的說就是每次指定的被觀察的對象的屬性被修改后,KVO就會自動通知相應的觀察者了。 // dog.m?代碼: #import?"Dog.h" @implementation?Dog
{
????@public NSString?*age; } @synthesize?name =?_name; -(void)setName:(NSString?*)name{?// 1 NSLog(@"xxxxx"); _name?= name; } -(NSString?*)name{?// 2
????NSLog(@"AAAAA");
????return?_name; } @end
person.m 代碼: #import?"Person.h"
@implementation?Person
-(void)setDog:(Dog?*)dog{?// 3
????_dog?= dog;
????//?添加當前對象為觀察者
??? [_dog?addObserver:self?forKeyPath:@"name"?options:NSKeyValueObservingOptionNew?|?NSKeyValueObservingOptionOld?context:@"hello kvo"];
}
-(void)dealloc{?// 6
??? [_dog?removeObserver:self?forKeyPath:@"name"]; } -(void)observeValueForKeyPath:(NSString?*)keyPath ofObject:(id)object change:(NSDictionary?*)change context:(void?*)context{?// 4 NSLog(@"context==%@",context); if([object?isKindOfClass:[Dog?class]] && [keyPath?isEqualToString:@"name"]){ NSString?*new = change[NSKeyValueChangeNewKey];
????????NSLog(@"new === %@",new);
??? }
} @end 下面看看調用過程是怎樣的? Person?*p = [[Person?alloc]init];
??????? p.dog?= myDog; myDog.name?=?@"fyz”;?//5 1)調用?p.dog?= myDog; 方法時,走 方法3. 2)然后來到 方法5 3)來到 方法2(getter) //打印了AAAA 4)然后 來到 方法1(setter) // 打印XXXX?(這里為什么?需要測試) 5 ) 又來到 方法2( getter ) //打印了AAAA?(這里又為什么?需要測試) 6 ) 然后來到 方法4 // 打印new === 7 ) 最后走析構函數 方法6 // 沒有加入觀察者模式時,只會調一次 方法1(set方法),相當于觀察者模式的存在. 先調用了一次getter方法, 再調一次setter方法,再調一次getter方法.
????@public NSString?*age; } 這時,只能通過KVC模式來賦值和取值. // 注: 先賦值,再取. [myDog?setValue:@"10"?forKey:@"age"];
????????NSString?*age = [myDog?valueForKey:@"age"]; NSLog(@"age ==== %@",age); 打印結果: age === 10 說明,賦值和取值過程成功.
KVO: 即:Key-Value Observing,它提供一種機制,當指定的對象的屬性被修改后,則對象就會接受到通知。簡單的說就是每次指定的被觀察的對象的屬性被修改后,KVO就會自動通知相應的觀察者了。 // dog.m?代碼: #import?"Dog.h" @implementation?Dog
{
????@public NSString?*age; } @synthesize?name =?_name; -(void)setName:(NSString?*)name{?// 1 NSLog(@"xxxxx"); _name?= name; } -(NSString?*)name{?// 2
????NSLog(@"AAAAA");
????return?_name; } @end
person.m 代碼: #import?"Person.h"
@implementation?Person
-(void)setDog:(Dog?*)dog{?// 3
????_dog?= dog;
????//?添加當前對象為觀察者
??? [_dog?addObserver:self?forKeyPath:@"name"?options:NSKeyValueObservingOptionNew?|?NSKeyValueObservingOptionOld?context:@"hello kvo"];
}
-(void)dealloc{?// 6
??? [_dog?removeObserver:self?forKeyPath:@"name"]; } -(void)observeValueForKeyPath:(NSString?*)keyPath ofObject:(id)object change:(NSDictionary?*)change context:(void?*)context{?// 4 NSLog(@"context==%@",context); if([object?isKindOfClass:[Dog?class]] && [keyPath?isEqualToString:@"name"]){ NSString?*new = change[NSKeyValueChangeNewKey];
????????NSLog(@"new === %@",new);
??? }
} @end 下面看看調用過程是怎樣的? Person?*p = [[Person?alloc]init];
??????? p.dog?= myDog; myDog.name?=?@"fyz”;?//5 1)調用?p.dog?= myDog; 方法時,走 方法3. 2)然后來到 方法5 3)來到 方法2(getter) //打印了AAAA 4)然后 來到 方法1(setter) // 打印XXXX?(這里為什么?需要測試) 5 ) 又來到 方法2( getter ) //打印了AAAA?(這里又為什么?需要測試) 6 ) 然后來到 方法4 // 打印new === 7 ) 最后走析構函數 方法6 // 沒有加入觀察者模式時,只會調一次 方法1(set方法),相當于觀察者模式的存在. 先調用了一次getter方法, 再調一次setter方法,再調一次getter方法.
轉載于:https://www.cnblogs.com/toxicanty/p/4453109.html
總結
以上是生活随笔為你收集整理的KVC/KVO 使用细节和调用顺序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android-功能】Android应
- 下一篇: MVC三层+会话层+线程安全+抽象工厂+