KVC/KVO 這方面知識以前在面試的時候遇到過,平時使用的并不多,但是查了一些博客后覺得這個東西很重要,今后應該多嘗試使用到程序中去.
這方面知識我是從一片博客中了解的,自己寫了小程序測試了一下.博客地址在這里,感謝博主!
KVC:即Key-Value Coding,是一個非正式的 Protocol界斜,提供一種機制來間接訪問對象的屬性屎媳。KVO 就是基于 KVC 實現(xiàn)的關(guān)鍵技術(shù)之一厚棵。
一個對象擁有某些屬性。比如說嗜愈,一個 Person 對象有一個 name 和一個 address 屬性。以 KVC 說法料扰,Person 對象分別有一個 value 對應他的 name 和 address 的 key昵骤。 key 只是一個字符串,它對應的值可以是任意類型的對象交惯。
下面附上代碼
@interfacePerson :NSObject
@property(nonatomic,copy)NSString*name;
@property(nonatomic,copy)NSString*age;
@property(nonatomic,copy)NSString*sex;
@property(nonatomic,copy)NSString*addr;
@property(nonatomic,copy)NSString*Test;//如果這里是大寫開頭,而dict里面是小寫開頭,則會報錯,反之,如果這里是小寫,那么dict里面首字母是大小寫不影響
@property(nonatomic,retain)Person*per;
@implementationPerson
-(void)setValue:(id)value forUndefinedKey:(NSString*)key//如果dict里面的鍵值對的key本類中沒有定義,寫這個函數(shù)則會消除報錯,本質(zhì)上是,當使用setValue:forKey來定義本類未定義的值時,使用這個類來消除錯誤
{
}
#if0
Person *p = [[Person alloc] init];
[p setValue:@"張紅"forKey:@"name"];
[p setValue:@"13"forKey:@"age"];
[p setValue:@"東部野馬"forKey:@"addr"];
[p setValue:@"Error"forKey:@"error"];
NSDictionary *dict =@{@"name":@"海南",@"age":@"22",@"sex":@"boy",@"addr":@"東南海",@"errors":@"err",@"Test":@"Test"};
Person *p1 = [[Person alloc] init];
[p1 setValuesForKeysWithDictionary:dict];
NSLog(@"name = %@,sex = %@,age = %@,addr = %@,test = %@",[p1 valueForKey:@"name"],[p1 valueForKey:@"sex"],[p1 valueForKey:@"age"],[p1 valueForKey:@"addr"],[p1 valueForKey:@"Test"]);
NSLog(@"%@",[p valueForKey:@"name"]);
Person *per = [[Person alloc] init];
//per = [p valueForKey:@"per"];
per.name =@"testname";
[p setValue:per forKey:@"per"];
//[p setValue:@"namejtest" forKeyPath:@"per.name"];
NSLog(@"test = %@",[p valueForKeyPath:@"per.name"]);
#else
arr= [NSMutableArrayarray];
Person*p2 = [[Personalloc]init];
Person*per = [[Personalloc]init];
[p2setValue:perforKey:@"per"];
[p2addObserver:selfforKeyPath:@"per.name"options:0context:(__bridgevoid*)(KVO_CONTEXT_ADDRESS_CHANGED)];
[p2setValue:@"chutiyan"forKeyPath:@"per.name"];
UIButton*btn = [UIButtonbuttonWithType:UIButtonTypeCustom];
btn.frame=CGRectMake(100,100,100,40);
btn.backgroundColor= [UIColorgreenColor];
[self.viewaddSubview:btn];
[btnaddTarget:selfaction:@selector(btnClick)forControlEvents:UIControlEventTouchUpInside];
index=0;
[arraddObject:p2];
#endif
-(void)btnClick
{
for(Person*perinarr) {
[persetValue:[NSStringstringWithFormat:@"%ldName",index]forKeyPath:@"per.name"];
}
index++;
}
-(void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context
{
if(context == (__bridgevoid*)(KVO_CONTEXT_ADDRESS_CHANGED)) {
NSString*name = [objectvalueForKeyPath:@"per.name"];
NSLog(@"%@",name);
}
}
-(void)dealloc
{
for(Person*perinarr) {
[perremoveObserver:selfforKeyPath:@"name"];
}
//[super dealloc];
}
原博客里舉得例子比較好,我這個代碼完全自己測試寫的,貼上來為了自己以后好回憶,順便看看代碼思想有沒有進步.