KVO内部原理

2020-11-27  本文已影响0人  code_牧轩

#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了。

上一篇 下一篇

猜你喜欢

热点阅读