美文网首页
KVO内部原理

KVO内部原理

作者: code_牧轩 | 来源:发表于2020-11-27 17:31 被阅读0次

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

    相关文章

      网友评论

          本文标题:KVO内部原理

          本文链接:https://www.haomeiwen.com/subject/zdaxwktx.html