KVC和KVO

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);
}

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖逛腿,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡挂捅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門堂湖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闲先,“玉大人,你說我怎么就攤上這事无蜂∷趴罚” “怎么了?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵斥季,是天一觀的道長训桶。 經(jīng)常有香客問我,道長酣倾,這世上最難降的妖魔是什么舵揭? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮躁锡,結果婚禮上午绳,老公的妹妹穿的比我還像新娘。我一直安慰自己映之,他們只是感情好拦焚,可當我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著杠输,像睡著了一般赎败。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蠢甲,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天僵刮,我揣著相機與錄音,去河邊找鬼鹦牛。 笑死搞糕,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的能岩。 我是一名探鬼主播寞宫,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼萧福,長吁一口氣:“原來是場噩夢啊……” “哼拉鹃!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤膏燕,失蹤者是張志新(化名)和其女友劉穎钥屈,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坝辫,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡篷就,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了近忙。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片竭业。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖及舍,靈堂內(nèi)的尸體忽然破棺而出未辆,到底是詐尸還是另有隱情,我是刑警寧澤锯玛,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布咐柜,位于F島的核電站,受9級特大地震影響攘残,放射性物質發(fā)生泄漏拙友。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一歼郭、第九天 我趴在偏房一處隱蔽的房頂上張望遗契。 院中可真熱鬧,春花似錦病曾、人聲如沸姊途。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捷兰。三九已至,卻和暖如春负敏,著一層夾襖步出監(jiān)牢的瞬間贡茅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工其做, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留顶考,地道東北人。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓妖泄,卻偏偏與公主長得像驹沿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蹈胡,可洞房花燭夜當晚...
    茶點故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 目錄:1.KVC用法渊季;2.KVC和對象的setter朋蔫、getter方法的區(qū)別;3.key和keyPath的區(qū)別却汉;4...
    倫倫子_f7b3閱讀 577評論 0 1
  • 在iOS開發(fā)中合砂,我們常常用到鍵值編碼KVC和鍵值監(jiān)聽KVO兩個東東青扔,今天小編和大家分享的就是這兩個東東在應用開發(fā)中...
    突然自我閱讀 1,002評論 2 3
  • 概念 先來看看概念,Key-value coding (KVC) 和 key-value observing (K...
    wuwy閱讀 1,330評論 0 1
  • 轉載:http://yulingtianxia.com/blog/2014/05/12/objective-czh...
    F麥子閱讀 969評論 0 0
  • 在編程中翩伪,最常見的就是程序的流程取決于你所使用的各種變量和屬性的值微猖,根據(jù)變量和屬性的值確定后面運行的代碼,有時會檢...
    pro648閱讀 1,644評論 2 27