#import "ViewController.h"
#import "lzhProson.h"
@interface ViewController ()
@property (nonatomic, strong) lzhProson * person1;
@property (nonatomic, strong) lzhProson * person2;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.userInteractionEnabled = YES;
self.view.backgroundColor = [UIColor redColor];
self.person1= [[lzhProsonalloc]init];
self.person1.age=10;
self.person2= [[lzhProsonalloc]init];
self.person2.age=20;
// self.person.name = @"er";
NSKeyValueObservingOptions keyValueObservingOptions = NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld ;
[self.person1addObserver:selfforKeyPath:@"age"options:keyValueObservingOptionscontext:@"2134"];//传入的值
// [self.person1 addObserver:self forKeyPath:@"age" options:keyValueObservingOptions context:@"2134"];//传入的值
// [self.person2 addObserver:self forKeyPath:@"age" options:keyValueObservingOptions context:@"2134"];//传入的值
}
//-(void)dealloc
//{
// [self.person removeObserver:self forKeyPath:@"age"];
//}
-(void)observeValueForKeyPath:(NSString*)keyPathofObject:(id)objectchange:(NSDictionaryid> *)changecontext:(void*)context
{
NSLog(@"%@-------%@----------%@-------%@",keyPath,object,change,context);
}
-(void)touchesBegan:(NSSet *)toucheswithEvent:(UIEvent*)event
{
//self.person1->isa == NSKVONotifying_lzhProson 是 lzhProson子类;superclass指向lzhProson类;里面也有set方法;
// self.person2->isa == lzhProson
self.person1.age=1;
self.person2.age=2;
// self.person.name = @"fg";
}
KVC的作用:
1、动态地取值和设值
利用KVC动态的取值和设值。
2、用KVC来访问和修改私有变量
对于类里的私有属性,Objective-C是无法直接访问的,但是KVC是可以的。 KVC本质上是操作方法列表以及在内存中查找实例变量。我们可以利用这个特性访问类的私有变量,例如下面在.m中定义的私有成员变量和属性,都可以通过KVC的方式访问。
这个操作对readonly的属性,@protected的成员变量,都可以正常访问。如果不想让外界访问类的成员变量,则可以将accessInstanceVariablesDirectly属性赋值为NO。
3、 Model和字典转换
这是KVC强大作用的又一次体现,KVC和Objc的runtime组合可以很容易的实现Model和字典的转换。
4、 修改一些控件的内部属性
这也是iOS开发中必不可少的小技巧。众所周知很多UI控件都由很多内部UI控件组合而成的,但是苹果并没有提供这访问这些控件的API,这样我们就无法正常地访问和修改这些控件的样式。而KVC在大多数情况可下可以解决这个问题。最常用的就是个性化UITextField中的placeHolderText了。
网友评论