KVC:Key-Value Coding
KVO:Key-Value Observing
Person.m
#import <Foundation/Foundation.h> @interface Person : NSObject{ //该访问修饰符用于说明即使私有成员变量也可以通过kvc方式访问和赋值 @PRivate NSString *_name; NSArray *_dogs; } @end @implementation Person @end
Dog.m
#import <Foundation/Foundation.h> @class Person; @interface Dog : NSObject { @private NSInteger _age; Person *_owner; } @end @implementation Dog @end
PersonObserve.m
#import <Foundation/Foundation.h> #import "Person.h" @interface PersonObserve : NSObject @end @implementation PersonObserve - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ Person *p = (Person *)object; //使用kvc方式获取成员变量keypath的值 NSLog(@"%@",[p valueForKey:keyPath]); } @end
main.m
#import <Foundation/Foundation.h> #import "Person.h" #import "PersonObserve.h" #import "Dog.h" int main(int argc, const char * argv[]) { //观察者类 PersonObserve *po = [[PersonObserve alloc] init]; Person *p = [[Person alloc] init]; //使用kvo方式对成员变量“name”的属性值变化增加观察者po //po将在该属性值发生变化时执行- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context方法 [p addObserver:po forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil]; //通过kvc方式设置成员变量“name”的属性值 //出发观察者执行对应方法 [p setValue:@"zhangsan" forKey:@"name"]; //kvc中forKeyPath的用法 Dog *d = [[Dog alloc] init]; [d setValue:p forKey:@"owner"]; [d setValue:@"lisi" forKeyPath:@"owner.name"]; //移除对私有成员变量“name”的观察 [p removeObserver:po forKeyPath:@"name"]; Dog *d1 = [[Dog alloc] init]; [d1 setValue:@10 forKey:@"age"]; Dog *d2 = [[Dog alloc] init]; [d2 setValue:@20 forKey:@"age"]; NSArray *array = [NSArray arrayWithObjects:d1,d2, nil]; [p setValue:array forKey:@"dogs"]; //kvc中valueForKeyPath数组内置表达式的用法 NSLog(@"dogs.age = %@",[p valueForKeyPath:@"dogs.age"]); NSLog(@"dogs.age.sum = %@",[p valueForKeyPath:@"[email protected]"]);//dogs数组中age的总和 NSLog(@"dogs.age.avg = %@",[p valueForKeyPath:@"[email protected]"]);//dogs数组中age的平均值 NSLog(@"dogs.age.max = %@",[p valueForKeyPath:@"[email protected]"]);//dogs数组中age的最大值 NSLog(@"dogs.age.min = %@",[p valueForKeyPath:@"[email protected]"]);//dogs数组中age的最小值 return 0; }
结果:
2015-03-07 21:09:34.611 KVC&KOC[3079:122638] zhangsan 2015-03-07 21:09:34.612 KVC&KOC[3079:122638] lisi 2015-03-07 21:09:34.613 KVC&KOC[3079:122638] dogs.age = ( 10, 20 ) 2015-03-07 21:09:34.613 KVC&KOC[3079:122638] dogs.age.sum = 30 2015-03-07 21:09:34.613 KVC&KOC[3079:122638] dogs.age.avg = 15 2015-03-07 21:09:34.613 KVC&KOC[3079:122638] dogs.age.max = 20 2015-03-07 21:09:34.613 KVC&KOC[3079:122638] dogs.age.min = 10 Program ended with exit code: 0