iOS KVC/KVO

1.KVC底層是通過runtime對method和value操作

比如說如下的一行KVC的代碼:

[sit setValue:@"sitename" forKey:@"name"];

就會被編譯器處理成:

SEL sel = sel_get_uid ("setValue:forKey:");

IMP method = objc_msg_lookup (site->isa,sel);

method(site, sel, @"sitename", @"name”);

前兩步就是通過rt找到method,最后一步更新值;

2.KVO就是基于KVC添加了消息通知,觀察者模式;

3.KVB?兩個基本方法

1:為對象添加觀察者OBserver

addObserver:forKeyPath:options:context:

2:觀察者OBserver收到信息的處理函數

observeValueForKeyPath:ofObject:change:context:

以下是使用Demo

1.直接在VC里面操作屬性/變量(不推薦耦合度不好)

@property (nonatomic,strong) NSString *str1;

在viewDidLoad加入:

[self addObserver:self forKeyPath:@"str1" options:NSKeyValueObservingOptionNew context:nil];//第一步

[self setValue:@"草泥馬KVO" forKey:@"str1”];//第二步

//回調方法

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

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

NSLog(@"count : %@",[change valueForKey:@"new"]);

}

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

NSLog(@"str1: %@",[change valueForKey:@"new"]);

}

}

在第一步添加注冊元素@“str1",然后第二步改變其值,此時第三步回調方法就會響應;

2.自定義類?OberserClass

#import

@interface OberserClass : NSObject

@property (nonatomic,assign) int count;

@end

#import "OberserClass.h"

@implementation OberserClass

@end

簡單添加一個屬性,什么也不做。然后在ViewDidLoad加入以下代碼:

cls = [[OberserClass alloc]init];//cls必須是成員變量,不能是局部變量

[cls addObserver:self forKeyPath:@"count" options:NSKeyValueObservingOptionNew context:nil];

[cls setValue:@"456" forKey:@"count"];

執行到最后一步observeValueForKeyPath就會收到通知,處理@“count"

3.自定義類內部處理

和第二種不一樣的是,在@implementation添加如下代碼:

- (void)setCount:(int)count{

_count = count;

[self? addObserver:self forKeyPath:@"count" options:NSKeyValueObservingOptionNew context:nil];

}

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

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

NSLog(@"count is :");

}

}

@end

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • KCV 其實由于ObjC的語言特性,你根部不必進行任何操作就可以進行屬性的動態讀寫,這種方式就是Key Value...
    TYM閱讀 1,065評論 0 4
  • 轉至元數據結尾創建: 董瀟偉,最新修改于: 十二月 23, 2016 轉至元數據起始第一章:isa和Class一....
    40c0490e5268閱讀 1,775評論 0 9
  • KVC KVC是key Value Coding的縮寫,主要方法有setValue:forKey和valueFor...
    小暖風閱讀 383評論 0 1
  • 45. addObserver:forKeyPath:options:context:各個參數的作用分別是什么,o...
    solozyx閱讀 277評論 0 0
  • 前言: 本文基本不講KVC/KVO的用法,只結合網上的資料說說對這種技術的理解。 由于KVO內容較少,而且是以KV...
    土b蘭博王閱讀 3,087評論 0 33