KVC取值 -- valueForKeyPath
// XMGBook.h
#import <Foundation/Foundation.h>
@interface XMGBook : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) double price;
@end
// XMGBook.m
#import "XMGBook.h"
@implementation XMGBook
@end
// main.m
#import <Foundation/Foundation.h>
#import "XMGBook.h"
int main(int argc, const char * argv[]) {
XMGBook *book1 = [[XMGBook alloc] init];
book1.name = @"123";
book1.price = 20.5;
XMGBook *book2 = [[XMGBook alloc] init];
book2.name = @"345";
book2.price = 30.5;
XMGBook *book3 = [[XMGBook alloc] init];
book3.name = @"678";
book3.price = 40.5;
NSArray *books = @[book1, book2, book3];
// 如果valueForKeyPath:方法的調(diào)用者是數(shù)組豁生,那么就是去訪問數(shù)組元素的屬性值
// 取得books數(shù)組中所有XMGBook對象的name屬性值腰懂,放在一個新的數(shù)組中返回
NSArray *names = [books valueForKeyPath:@"name"];
NSLog(@"%@", names);
// XMGPerson *p = [[XMGPerson alloc] init];
// p.books = @[book1, book2, book3];
//
// NSLog(@"%@", [p.books valueForKeyPath:@"@count"]);
// NSLog(@"%@", [p valueForKeyPath:@"books.@count"]);
//
// NSLog(@"%@", [p.books valueForKeyPath:@"@avg.price"]);
// NSLog(@"%@", [p valueForKeyPath:@"books.@avg.price"]);
//
// NSLog(@"%@", [p.books valueForKeyPath:@"@max.price"]);
// NSLog(@"%@", [p valueForKeyPath:@"books.@max.price"]);
//
// NSLog(@"%@", [p.books valueForKeyPath:@"@min.price"]);
// NSLog(@"%@", [p valueForKeyPath:@"books.@min.price"]);
return 0;
}
輸出結果圖:
// XMGPerson.h
#import <Foundation/Foundation.h>
@interface XMGPerson : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) double money;
@end
// XMGPerson.m
#import "XMGPerson.h"
@implementation XMGPerson
@end
// main.m
#import <Foundation/Foundation.h>
#import "XMGPerson.h"
int main(int argc, const char * argv[]) {
XMGPerson *person = [[XMGPerson alloc] init];
person.name = @"abc";
person.money = 9.9;
NSLog(@"%@,%@", [person valueForKeyPath:@"name"], [person valueForKeyPath:@"money"]);
return 0;
}
效果圖:
KVC
- 全稱:Key Value Coding(鍵值編碼)
- 賦值
// 能夠修改私有成員變量
[p setValue:<#(nullable id)#> forKey:<#(nonnull NSString *)#>];
[p setValue:<#(nullable id)#> forKeyPath:<#(nonnull NSString *)#>];
[p setValuesForKeysWithDictionary:(nonnull NSDictionary<NSString *,id> *)];
- 取值
// 能夠取得私有成員變量
[p valueForKey:<#(nonnull NSString *)#>];
[p valueForKeyPath:<#(nonnull NSString *)#>];
[p dictionaryWithValuesForKeys:<#(nonnull NSArray<NSString *> *)#>];
- KVO
/*
KVO: Key Value Observing (鍵值監(jiān)聽)
作用: 監(jiān)聽對象的屬性值發(fā)生改變, 通知給監(jiān)聽者
*/
#import "ViewController.h"
#import "XMGPerson.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
XMGPerson *person = [[XMGPerson alloc] init];
person.name = @"zhangsan";
// 為對象p添加一個觀察者(監(jiān)聽器)
// Observer 觀察者(監(jiān)聽器)
// KeyPath 鍵 ---> name (或者可以這樣理解:屬性名:需要監(jiān)聽哪個屬性)
// options 返回給監(jiān)聽者舊值或者新值
[person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionOld context:nil];
// [person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
person.name = @"lisi";
// 釋放
// [person removeObserver:self forKeyPath:@"name"];
[person removeObserver:self forKeyPath:@"name"];
}
// 應用場景很少,可能就是做彩票那里用到
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
NSLog(@"%@-----%@-----%@",keyPath, object, change);
NSLog(@"%s", __func__);
}
//- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
// NSLog(@"%@-----%@-----%@",keyPath, object, change);
// if([keyPath isEqualToString:@"name"]){
// // ...業(yè)務邏輯
// }else if ([keyPath isEqualToString:@"height"]){
// // ...業(yè)務邏輯
// }
//}
KVO
全稱: Key Value Observing(鍵值監(jiān)聽)
作用:監(jiān)聽模型的屬性值改變
-
步驟
- 添加監(jiān)聽器
// 利用b對象來監(jiān)聽a對象name屬性的改變 [a addObserver:b forKeyPath:@"name" options:NSKeyValueObservingOptionOld context:@"test"];
- 在監(jiān)聽器中實現(xiàn)監(jiān)聽方法
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
NSLog(@"%@-----%@-----%@------%@",keyPath, object, changem, text);
NSLog(@"%s", func);
}