KVC KVO 模式

本文介绍了Objective-C中KVC(key-value coding)的基本使用方法,包括属性的直接赋值,并展示了如何利用KVO(key-value observing)来监听对象属性的变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


KVC  key value coding  相当于OC的类对象 . 语法直接赋值

@interface People : NSObject

@property (nonatomic) int name;
@property (nonatomic) NSString  *nameStr;

@end


 People *p = [[People alloc]init];
    [p setValue:@2 forKey:@"name"];
    [p setValue:@"sdfsdf" forKey:@"nameStr"];

    array = [NSMutableArray new];
    [array addObject:p];
    
    int a = [[p valueForKey:@"name"] intValue];
    NSString *a2 = [p valueForKey:@"nameStr"];


KVO 监听值变化,当监听的key 的 value值变化时,会触发

observeValueForKeyPath
必须是全局变量或者用数组保存局部变量,否则会报错:
An instance 0x60000002f940 of class People was deallocated while key value observers were still registered with it. Current observation info: <NSKeyValueObservationInfo 0x60000002ff00> (
<NSKeyValueObservance 0x60000005e3c0: Observer: 0x7fc3fad0c030, Key path: nameStr, Options: <New: NO, Old: NO, Prior: NO> Context: 0x103cdd298, Property: 0x60000005e450>
)'
static NSString * const KVO_NameStr_CHANGED = @"KVO_CONTEXT_ADDRESS_CHANGED";
[p addObserver:self forKeyPath:@"nameStr" options:0 context:(__bridge void * _Nullable)(KVO_NameStr_CHANGED)];

-(void)dealloc
{
    People *p = [array objectAtIndex:0];
    [p removeObserver:self forKeyPath:KVO_NameStr_CHANGED];
    
}

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
    if (context == (__bridge void * _Nullable)(KVO_NameStr_CHANGED))
    {
        NSLog(@"%@",[object valueForKey:@"nameStr"]);
    }
}
-(void)buttonClickToChangKVO
{
//    p.nameStr = @"200";
    People *p = [array objectAtIndex:0];
    p.nameStr = @"200";

}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值