?KVC
KVC實際上是Key-Value Coding的簡稱,它是一種可以直接通過字符串的名字(key)來間接訪問類屬性(實例變量)的機制。
代碼實現:
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Dog.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *xiaoming = [[Person alloc] init];
//使用kvc設置變量的值
[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的縮寫,顧名思義就是一種觀察、監控。它提供一種機制,當指定的對象的屬性被修改后,則對象就會接受到通知。簡單的說就是每次指定的被觀察的對象的屬性被修改后,KVO就會自動通知相應的觀察者了。
代碼實現:(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