KVO和KVC

2016-07-27  本文已影响65人  珍此良辰

KVC

// 创建person对象
Person *p = [[Person alloc] init];
// 给person对象属性赋值
p.name = @"狗蛋儿";
p.sex = @"男";
p.age = 188;

.h

@interface Person : NSObject

/**
 * 获取身高
 */
- (void)getHeight;

@end

.m

@implementation Person
{
    NSInteger _height;  // 身高
}

- (void)getHeight {

    NSLog(@"身高--%ld", _height);
}

@end


[p setValue:@1.8f forKey:@"height"];

// 获取身高
[p getHeight];

结果:


身高打印结果.png
[p setValue:@1.8f forKey:@"height"];

- (instancetype)initWithDict:(NSDictionary *)dict {

    if (self = [super init]) {
        
        [self setValuesForKeysWithDictionary:dict];
    }
    
    return self;
}

// 初始化字典内容
    NSDictionary *dict = @{
                           @"name" : @"狗蛋儿",
                           @"sex" : @"男",
                           @"age" : @188,
                           };
    // 调用initWithDict:方法
    Person *p1 = [p initWithDict:dict];
    // 打印
    NSLog(@"p1.name=%@, p1.sex=%@, p1.age=%ld", p1.name, p1.sex, p1.age);

结果:


KVC字典转模型演示.png

KVO

1.添加观察者

    // 实例化person对象
    _p = [[Person alloc] init];
    _p.name = @"狗蛋儿";

    /**
     *  观察p对象的name值,如果改变则打印新值
     *
     *  @param observer 观察者
     *  @param keyPath  观察的属性
     *  @param options  观察模式
     *  @param context  额外数据
     */
     // options取值:NSKeyValueObservingOptionNew(新值), NSKeyValueObservingOptionOld(旧值)
     
    [_p addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];

2.在回调中实现监听方法

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
    
    NSLog(@"%@的值改变为%@",keyPath, change[@"new"]);
}

3.移除观察者(重要)

- (void)dealloc {
    
    // 移除
    [_p removeObserver:self forKeyPath:@"name"];
}

结果:


KVO演示.png

最后附上本章参考Demo 密码: b55p

上一篇 下一篇

猜你喜欢

热点阅读