1. 程式人生 > >2-4 iOS KVC&KVO

2-4 iOS KVC&KVO

KVC

概念:KVC,鍵-值編碼,可以使用字串直接訪問物件的屬性,而不需要顯式呼叫存取方法。在執行時動態訪問和修改屬性的值,而不是在編譯時確定。OC所有繼承NSObject的型別都能使用KVC。

怎麼用?什麼時候用?

- (nullable id)valueForKey:(NSString *)key;                          //直接通過Key來取值
- (void)setValue:(nullable id)value forKey:(NSString *)key;          //通過Key來設值
- (nullable id)valueForKeyPath:(NSString *)keyPath;                  //通過KeyPath來取值
- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;  //通過KeyPath來設值
+ (BOOL)accessInstanceVariablesDirectly;
//預設返回YES,表示如果沒有找到Set方法的話,會按照_key,_iskey,key,iskey的順序搜尋成員,設定成NO就不這樣搜尋
- (BOOL)validateValue:(inout id __nullable * __nonnull)ioValue forKey:(NSString *)inKey error:(out NSError **)outError;
//KVC提供屬性值確認的API,它可以用來檢查set的值是否正確、為不正確的值做一個替換值或者拒絕設定新值並返回錯誤原因。
- (NSMutableArray *)mutableArrayValueForKey:(NSString *)key;
//這是集合操作的API,裡面還有一系列這樣的API,如果屬性是一個NSMutableArray,那麼可以用這個方法來返回
- (nullable id)valueForUndefinedKey:(NSString *)key;
//如果Key不存在,且沒有KVC無法搜尋到任何和Key有關的欄位或者屬性,則會呼叫這個方法,預設是丟擲異常
- (void)setValue:(nullable id)value forUndefinedKey:(NSString *)key;
//和上一個方法一樣,只不過是設值。
- (void)setNilValueForKey:(NSString *)key;
//如果你在SetValue方法時面給Value傳nil,則會呼叫這個方法
- (NSDictionary *)dictionaryWithValuesForKeys:(NSArray *)keys;
//輸入一組key,返回該組key對應的Value,再轉成字典返回,用於將Model轉到字典。

使用方法:

Dog* dog = [Dog new];
dog.name = @"KeLe";
[people setValue:dog forKey:@"myDog"];//myDog為People類的屬性 @property (nonatomic, strong) Dog *myDog;
NSString* name1 = people.myDog.name;
NSString * name2 = [people valueForKeyPath:@"myDog.name"];//people類的myDog成員也屬於自定義類。要獲取到myDog中的name屬性。1.可以先valueForKey獲取到myDog,再通過valueForKey獲取到name。但是這樣太麻煩了。我們直接用keyPath直接獲取成員變數(自定義類)的屬性。
NSLog(@"name1:%@   name2:%@",name1,name2);
//列印結果
2018-03-30 11:20:10.129 KVCDemo[1346:95910] name1:KeLe   name2:KeLe

什麼時候用?

1.需要獲取類的私有屬性。比如如何修改textField的placeholder的顏色和字型大小呢?MyTextField setValue: forKeyPath:(_placeHolderLabel.textColor _placeHolderLabel.font)。如果你問我為什麼知道UITextField的佔位Label的名字是_placeHoldLabel。教你一招:

- (NSMutableArray *)getAllIvarListInClass:(Class)iVarClass {
    unsigned int numIvars; //成員變數個數
    NSMutableArray *allIvar = [NSMutableArray array];
    Ivar *vars = class_copyIvarList(iVarClass, &numIvars);
    NSString *key=nil;
    for(int i = 0; i < numIvars; i++) {
        Ivar thisIvar = vars[i];
        key = [NSString stringWithUTF8String:ivar_getName(thisIvar)];  //獲取成員變數的名字
        NSLog(@"variable name :%@", key);
        [allIvar addObject:key];
        key = [NSString stringWithUTF8String:ivar_getTypeEncoding(thisIvar)]; //獲取成員變數的資料型別
        NSLog(@"variable type :%@", key);
    }
    free(vars);
    return allIvar;
}
返回當前類的所有成員變數。之後 我們可以通過變數名判斷是哪個屬性型別。

2.動態取值,設定。如上程式碼所示。

3.操作集合,NSArray,NSSet。

4.將字典轉化為model

    NSDictionary *dict = @{
                           @"name"  : @"zhangsan",
                           @"height" : @"175",
                           };
    // 建立模型
    Person *p = [[Person alloc] init];
    // 字典轉模型
    [p setValuesForKeysWithDictionary:dict];
    NSLog(@"person's name is the %@",p.name);

比較常用的場景大概就是這些


KVO

概念:KVO,鍵-值觀察者。即對某個物件的屬性新增觀察者,當這個屬性的值發生變化時,就會呼叫“observeValueForKeyPath”,我們可以在這個方法裡面來進行操作。

      當某個類的物件第一次被新增觀察者時。系統在執行時建立該類的派生類,重寫了該物件的setter方法,以便新增觀察,並將原來類的isa指向派生類。所以當setter這個物件時,呼叫的是派生類中重寫的這套,啟用鍵值觀察。

怎麼用?什麼時候用?

name為myKVC類中的屬性。

[myKVC addObserver:self forKeyPath:@"name" options: NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];

當name的值發生變化時:
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
    //拿到新值/舊值,進行操作
    NSLog(@"newValue----%@",change[@"new"]);
    NSLog(@"oldValue----%@",change[@"old"]);

}

取消監聽:

-(void)dealloc
{
    [myKVC removeObserver:self forKeyPath:@"name"];
}

什麼時候用呢?

1.監聽模型屬性,更新UI,比如列表有個閱讀數,點選進入詳情,閱讀數應該+1,返回列表則應該通過對應的UI表現出來。

2.監聽上拉重新整理,下拉載入的contentoffesize。

3.室內地圖,藍芽開發中,監聽當前點的postion。實時更新UI。

4.webview混排監聽contentsize。

相關推薦

2-4 iOS KVC&KVO

KVC概念:KVC,鍵-值編碼,可以使用字串直接訪問物件的屬性,而不需要顯式呼叫存取方法。在執行時動態訪問和修改屬性的值,而不是在編譯時確定。OC所有繼承NSObject的型別都能使用KVC。怎麼用?什麼時候用?- (nullable id)valueForKey:(NSSt

iOS KVCKVO簡介

級別: ★★☆☆☆ 標籤:「iOS」「KVC」「KVO」 作者: dac_1033 審校: QiShare團隊 一、 KVC 1.1 KVC介紹 KVC是Key Value Coding的縮寫,即 鍵值編碼。 在iOS的開發中,可以通過key名直接訪問例項物件的屬性,而不需要呼叫明確的存取方法

iOS底層原理總結-- 深入理解 KVC\KVO 實現機制

iOS底層原理總結–OC物件的本質(一) - 掘金 iOS底層原理總結–OC物件的本質(二) - 掘金 iOS底層原理總結–OC物件的分類:instance、class、meta-calss物件的isa和superclass - 掘金 iOS底層原理總結-- KVO/KVC的本質

2.4 通用的網頁信息結構化信息提取的方法

ges 標題 分析 控制 我們 beautiful html 官方文檔 txt 我們在抓網頁的時候,希望獲得的是網頁中的有效信息。事實上,直接抓取下來的內容是網頁全部的HTML代碼,代碼中有很多標簽、格式控制等等無效的信息。這一節我們就來講解對於任意一個網頁,我們怎麽提

【轉載】Hadoop 2.7.3 和Hbase 1.2.4安裝教程

啟動 運行 property new rop net 文本文 .tar.gz cor 轉載地址:http://blog.csdn.net/napoay/article/details/54136398 目錄(?)[+] 一、機器環境

Ubuntu 14.04 配置OpenCv 2.4.9

-1 org sent release nbsp build echo opencv 2 時間 安裝工具 g++ 鏈接:http://www.cnblogs.com/LQLin168/p/6844593.html 下載OpenCv 2.4.9(官網地址):http://

Python教程(2.4)——字符串

運算 this sca 新的 也會 註意 詳細 book 用兩個 2.2節講過,Python中有字符串類型。在Python中,字符串用‘或"括起,例如‘abc‘、"qwerty"等都是字符串。註意‘和"並不是字符串的內容。 ASCII(American Standard

Apache/2.4.9啟動錯誤:AH01630: client denied by server configuration

2.4 -s 錯誤 client ont pop 配置 出現 doc 在升級Yii框架1.11->2.0beta時,PHP升級到5.5。順帶升級Apache2.2.x到2.4.9。把原有vhost配置移植過來,出現Apache啟動錯誤:AH01630: client

WPF筆記(2.4 Grid)

font 習慣 src pixel 不同 單元格 裝載 out 生成 第一章已經簡單介紹過這個容器,這一節詳細介紹。Grid一般是用表格(Grid.Row 和Grid.Column )的,比StackPanel更細致一些,但是,這麽玩很麻煩,先橫著豎著定義一大堆,然後把元素

hdu ACM Steps 1.2.4 Box of Bricks

return logs 移動 solid bottom top 想想 ons 模擬題 模擬題。 題意為把高度不同的磚頭堆變成高度相同的磚頭堆最少需要移動幾次。 想想就知道,要把每個磚頭堆變成平均高度磚頭堆最少需要移動的塊數就是倆者的差值。 把所有差值都加起來以後要除以

OpenLDAP學習筆記(基於OpenLDAP-2.4.x)

ldap slapd 同步 1.1、什麽是目錄服務(Directory Services)? 目錄是一個特殊的數據庫,專門用於搜索和瀏覽,另外也支持基本的查詢和更新功能。 目錄是一個為查詢、瀏覽和搜索而優化的專業分布式數據庫,它呈樹狀結構組織數據,就好象Linux/Unix系統中的文件

小豬的數據結構輔助教程——2.4 線性表中的循環鏈表

linklist tro listt his alloc ret 線圖 循環鏈表 exit 小豬的數據結構輔助教程——2.4 線性表中的循環鏈表

在Ubuntu14.04下安裝 ffmpeg-2.4.13(處理視頻用,將視頻保存為圖片序列)

ibm blog 提取 ext aac sta video images bmp 首先在 http://www.ffmpeg.org/olddownload.html 下載 ffmpeg-2.4.13.tar.bz2 ; 然後安裝 yasm 和 libx264: apt

2.2.4 FrameLayout(幀布局)

timer motion 常用 把他 往裏面 height source 繪制 容器 本節引言 FrameLayout(幀布局)可以說是六大布局中最為簡單的一個布局,這個布局直接在屏幕上開辟出一塊空白的區域,當我們往裏面添加控件的時候,會默認把他們放到這塊區域的左上角,而這

3-opencv 2.4.9安裝及配置

技術 build bsp 安裝 -1 images http 9.png .cn 1- 2- 3- 4- C:\Program Files\opencv\build\x86\vc12\bin 5- 3-opencv 2.4.9安裝及配置

zabbix 2.4.5升級到3.2.6總結

zabbix1、如果php版本小於5.6,需要升級到5.6以上。2、保存數據庫不變,當zabbix server或zabbix proxy升級後啟動時會自動更新數據庫。3、整個架構的zabbix server 和 zabbix proxy都要同時升級。4、如果升級後新增到proxy的機器無法識別,先重啟pro

web.xml & web-fragment.xml (Servlet 2.3, 2.4, 2.5 + 3.0)模板

div location log javaee mls schema ins pub too 轉自:http://jlcon.iteye.com/blog/890964 web.xml v2.3 Xml代碼 <?xml version="1.0" en

數據結構與算法2-4 堆棧鏈式存儲

數據 erro col free pty spa ret nod 插入 鏈表中,只有一端進行插入與刪除 在表頭的位置,以避免需要知道實際數據長度 結構: typedef struct Node() { ElementType data; struct

cvc-complex-type.2.4.a: Invalid content was found starting with element

lex -s 2.4 logs nbsp onf -type sch xsd cvc-complex-type.2.4.a: Invalid content was found starting with element ‘display-name‘. One of ‘{

學習Opencv 2.4.9 (一)---Opencv + vs2012環境配置

-a class targe 貝爾 waitkey ron ini win font 作者:咕唧咕唧liukun321來自:http://blog.csdn.net/liukun321首先獲得最新的Opencv 2.4.9源代碼:opencv源代碼下載一、Opencv環