KVC&KVO的部分應(yīng)用

?KVC
  KVC實際上是Key-Value Coding的簡稱,它是一種可以直接通過字符串的名字(key)來間接訪問類屬性(實例變量)的機制。
 代碼實現(xiàn):

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Dog.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *xiaoming = [[Person alloc] init];
        
        //使用kvc設(shè)置變量的值
        [xiaoming setValue:@"xm" forKey:@"name"];
        
        NSString *name = [xiaoming valueForKey:@"name"];
        NSLog(@"%@", name);
        
        //確保狗是存在的
        Dog *ww = [[Dog alloc] init];
        [xiaoming setValue:ww forKeyPath:@"dg"];
        
        [xiaoming setValue:@"汪汪" forKeyPath:@"dg.dogName"];
        NSLog(@"%@", [xiaoming valueForKeyPath:@"dg.dogName"]);
    }
    return 0;
}
P.S. kvc是一種間接的訪問,這里特別要注意的是:key值,也就是變量的名字一定不可以寫錯!#

?KVO

Key-Value Observing的縮寫,顧名思義就是一種觀察、監(jiān)控。它提供一種機制,當指定的對象的屬性被修改后,則對象就會接受到通知。簡單的說就是每次指定的被觀察的對象的屬性被修改后,KVO就會自動通知相應(yīng)的觀察者了。

代碼實現(xiàn):(MRC)

#import "Person.h"

@implementation Person

- (void)dealloc{
    [_card release];
    [self removeObserver:self forKeyPath:@"card.money"];
    [super dealloc];
}
- (instancetype)init{
    if (self = [super init]) {
        self.card = [[[CreditCard alloc] init] autorelease];
        
        [self addObserver:self forKeyPath:@"card.money" options:NSKeyValueObservingOptionOld| NSKeyValueObservingOptionNew context:nil];
    }
    return self;
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
    NSLog(@"old:%@", [change objectForKey:NSKeyValueChangeOldKey]);
    NSLog(@"new:%@", [change objectForKey:NSKeyValueChangeNewKey]);

}

@end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容