03-KVC的基本使用和本质

一、KVC设值的原理

二、KVC取值原理

  • 验证设置和取值代码:
  • 1、MJPerson类
----------------------------MJPerson.h--------------------------
#import <Foundation/Foundation.h>

@interface MJPerson : NSObject
{
    @public
//    int age;
//    int isAge;
//    int _isAge;
//    int _age;
}

@end

-------------------------------MJPerson.m-------------------------------
#import "MJPerson.h"

@implementation MJPerson

//- (int)getAge
//{
//    return 11;
//}

//- (int)age
//{
//    return 12;
//}

//- (int)isAge
//{
//    return 13;
//}

//- (int)_age
//{
//    return 14;
//}

//- (void)setAge:(int)age
//{
//    NSLog(@"setAge: - %d", age);
//}

//- (void)_setAge:(int)age
//{
//    NSLog(@"_setAge: - %d", age);
//}

//- (void)willChangeValueForKey:(NSString *)key
//{
//    [super willChangeValueForKey:key];
//    NSLog(@"willChangeValueForKey - %@", key);
//}
//
//- (void)didChangeValueForKey:(NSString *)key
//{
//    NSLog(@"didChangeValueForKey - begin - %@", key);
//    [super didChangeValueForKey:key];
//    NSLog(@"didChangeValueForKey - end - %@", key);
//}

// 默认的返回值就是YES
//+ (BOOL)accessInstanceVariablesDirectly
//{
//    return YES;
//}

@end
  • 2、自定义监听MJObserver类
------------------------------MJObserver.h-----------------------------
#import <Foundation/Foundation.h>

@interface MJObserver : NSObject

@end

------------------------------MJObserver.m------------------------------
#import "MJObserver.h"

@implementation MJObserver

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
    NSLog(@"observeValueForKeyPath - %@", change);
}

@end
  • 3、main.m
#import <Foundation/Foundation.h>
#import "MJPerson.h"
#import "MJObserver.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        MJPerson *person = [[MJPerson alloc] init];
//        person->_age = 10;
//        person->_isAge = 11;
//        person->age = 12;
//        person->isAge = 13;
        
        
        NSLog(@"%@", [person valueForKey:@"age"]);
    }
    return 0;
}


void test()
{
    MJObserver *observer = [[MJObserver alloc] init];
    MJPerson *person = [[MJPerson alloc] init];
    
    // 添加KVO监听
    [person addObserver:observer forKeyPath:@"age" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:NULL];
    
    // 通过KVC修改age属性
    [person setValue:@10 forKey:@"age"];
    // [person willChangeValueForKey:@"age"];
    // person->_age = 10;
    // [person didChangeValueForKey:@"age"];
    
    // 移除KVO监听
    [person removeObserver:observer forKeyPath:@"age"];
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,806评论 1 32
  • KVC(Key-value coding)键值编码,iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,...
    CALayer_Sai阅读 2,742评论 0 4
  • KVC(Key-valuecoding)键值编码,单看这个名字可能不太好理解。其实翻译一下就很简单了,就是指iOS...
    榕樹頭阅读 789评论 0 2
  • 目录导读: 腿部专题安排:(点击蓝字超链接跳转) 〓腿部训练的8大益处〓腿部肌肉认识〓蹲类动作现状〓深蹲,没有绝对...
    健身干货分享君阅读 2,566评论 0 5
  • 1. 背景介绍 团队使用 Gitlab 管理代码,按照以下结构部署: Nginx 反向代理,转发到 Gitlab ...
    gucs阅读 1,760评论 0 1

友情链接更多精彩内容