OC 中的KVC和KVO

KVC: key value coding 鍵值編碼。ios


能夠將對象屬性變爲一個鍵從而去設置屬性的值
一.KVC的四種方法
數組

1.setValue:forKey: 設置類屬性的值
如: [hunter setValue:
"光頭強" forKey:"name"];
編碼

2.valueForKey: 取相對應的屬性的值
如: [person valueForKey:@"name"]
spa

3.setValue:forKeyPath: 根據鍵路徑設置類屬性的值3d

4.valueForKeyPath: 根據鍵路徑取相對應的屬性的值(對象屬性是另外一個的類屬性)
如: [person valueForKeyPath:@"hunterPig.weight"]
rest

二.KVC中經常使用的幾種計算方式
如:
//建立森林對象
Forest *forest = [[Forest alloc]init];
//把三隻豬放到同一個數組中
NSArray *array = 
[boarI,boarIII,boarII,boarII];
//將存放豬的數組放入到森林數組(是森裏類的一個屬性)裏 即完成了
[forest setValue:array forKey:
"forestArray"];code

1.count: 計算數量
//求豬的個數
NSLog(
"豬的個數是:%",[forest valueForKeyPath:"forestArray.@count"])orm

2.max: 計算最大值
//求豬重量的最大值
NSLog(
"豬的重量的最大值是:%",[forest valueForKeyPath:"forestArray.@max.weight"]);server

3.min: 計算最小值
//求豬重量的最小值
NSLog(
"豬的重量的最小值是:%",[forest valueForKeyPath:"forestArray.@min.weight"]);對象

4.sum: 計算總和
//求豬重量的總和
NSLog(
"豬的重量的總值是:%",[forest valueForKeyPath:"forestArray.@sum.weight"]);

5.avg: 計算平均值
//求豬重量的平均值
NSLog(
"豬的重量的平均值是:%",[forest valueForKeyPath:"forestArray.@avg.weight"]);

三.針對數組
1. 自動去除數組重複的元素  
distinctUnionOfObjects
NSArray *arr = 
[1,@2,@3,@2];
NSLog(
"數組裏的元素有%@",[arr valueForKeyPath:"@distinctUnionOfObjects.self"]);

2. 不會自動去除數組多餘的元素 @unionOfObjects

  NSLog(@"數組裏的元素有%@",[arrvalueForKeyPath:@"@unionOfObjects.self"]);



KVO: key value observing 當類屬性的值發生改變時,會自動調用監聽回調方法進行提醒

一:KVO中必有的三種方法
1.給對象添加監聽者 
[被監聽者 addObserver:監聽者 forKeyPath:@「類屬性」 options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
注意:被監聽者和監聽者能夠是同一類實例化出的兩個相同或不一樣的對象,也能夠是不一樣類分別實例化出的對象
類屬性能夠是本身類的屬性,也能夠是對象類屬性裏面的屬性

2.給對象移除監聽者 
[被監聽者 removeObserver:監聽者 forKeyPath:@"類屬性"];

3.一旦類屬性的值發生改變,監聽回調如下方法
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
其中的四個屬性:
keyPath :監聽的key
object: 監聽的對象 
change: 返回新值和舊值(在添加監聽者時須要設置)
context:上下文內容

它們的輸出方式爲:
NSLog(
"keyPath :%",keyPath);
NSLog(
"object :%",[object valueForKey:「類屬性」]);
NSLog(
"change :%",change);
取出舊值:[change valueForKey:
「old」];
取出新值:[change valueForKey:@「new」];

類屬性值發生改變時是發生在添加和移除監聽者之間的


舉例說明KVO

人監聽帳戶裏的帳戶名和帳戶餘額屬性

main.m

#import <Foundation/Foundation.h>

#import "Person.h"

#import "Account.h"


int main(int argc, const char * argv[]) {

    

    //實例化person對象

    Person *person = [[Person alloc]init];

    

    //實例化一個帳戶

    Account *account = [[Account alloc]init];

    

    //給帳戶設置餘額和帳戶名

    [account setValue:@"200" forKey:@"money"];

    [account setValue:@"123456" forKey:@"name"];

    

    //給帳戶添加監聽者來監聽它的餘額

    [account addObserver:person forKeyPath:@"money" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];

    

    //給帳戶添加監聽者來監聽它的zhanghum

    [account addObserver:person forKeyPath:@"name" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];


    

    //給帳戶從新設置餘額和帳戶名

    [account setValue:@"500" forKey:@"money"];

    [account setValue:@"678954" forKey:@"name"];


    //移除監聽者

    [account removeObserver:person forKeyPath:@"money"];

    [account removeObserver:person forKeyPath:@"name"];


    return 0;

}

person.m

#import "Person.h"


@implementation Person

//一旦被監聽者的屬性值發生改變,當即進入此方法

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

{

//    NSLog(@"keyPath :%@",keyPath);

//    NSLog(@"object :%@",[object valueForKey:@"money"]);

//    NSLog(@"change :%@",change);

    

    //當同時監聽對象的多個屬性時,輸出改變值時須要進行判斷

    if ([keyPath isEqualToString:@"money"]) {

        

        NSLog(@"您的帳戶餘額發生改變,當前金額爲%@",[object valueForKey:keyPath]);

        

      NSLog(@"您當前餘額總共有%i",[[change valueForKey:@"old"]intValue] + [[change valueForKey:@"new"]intValue]);

    }

    else

        if ([keyPath isEqualToString:@"name"]) {

            NSLog(@"您的帳戶名發生改變,當前帳戶名爲:%@",[object valueForKey:keyPath]);

        }

     

}


@end











編輯 跟蹤 複製 刪除

相關文章
相關標籤/搜索