1. 程式人生 > >KVO 和 KVC

KVO 和 KVC

KVC

  • 用 KVC 實現高階訊息傳遞

valueForKey: 有很多有用的特例,比如說 NSArray 和 NSSet 這樣的容器類都覆蓋了這個方法。valueForKey: 被傳遞給容器中得每一個物件,而不是對容器本身進行操作。結果會被新增進返回的容器中。這樣,開發者能很方便的用一個容器建立另一個容器物件,比如像這樣:

[objc] view plain copy
 print?在CODE上檢視程式碼片派生到我的程式碼片
  1. NSArray *array = @[@"foo",@"bar",@"baz"];  
  2. NSArray *capitals = [array valueForKey
    :@"capitalizedString"];  

方法 capitalizedString 被傳遞給 NSArray 中的每一項,並返回一個包含結果的新 NSArray 。把訊息(capitalizedString)作為引數傳遞稱為高階訊息傳遞(Higher Order Messaging)。多個訊息可以用鍵路徑傳遞:

[objc] view plain copy
 print?在CODE上檢視程式碼片派生到我的程式碼片
  1. NSArray *array = @[@"foo",@"bar",@"baz"];  
  2. NSArray *capitalLengths = [array valueForKeyPath
    :@"capitalizedString.length"];  

以上程式碼對 array 的每一個元素呼叫 capitalizedString ,然後呼叫 length ,在把返回值封裝進 NSNumber 物件。結果被收集進名為 capitalLengths 的新陣列。

  • 容器操作符

KVC 還提供了很複雜的函式,比如說自動對一組數字求和或者求平均值。看一下這個例子:

[objc] view plain copy
 print?在CODE上檢視程式碼片派生到我的程式碼片
  1. NSArray *array = @[@"foo",@"bar",@"baz"];  
  2. NSUInteger totalLenth = [[array valueForKeyPath
    :@"@sum.length"] intValue];  

@sum 是一個操作符,對指定的屬性(length)求和。注意,這種寫法可能比等價的迴圈寫法慢幾百倍。

在處理有幾千個或者幾萬個元素的陣列時,效能問題通常會至關重要。除了 @sum ,在 IOS 開發者庫的 Key-Value Coding Programming Guide 中還有很多其他的操作符。這些操作符在處理 Core Data 時尤其有用,而且比等價的迴圈寫法快,因為它們優化為資料庫查詢操作。不過你不能建立自己的操作。

KVO

KVO是Cocoa的一個重要機制,他提供了觀察某一屬性變化的方法,極大的簡化了程式碼。這種觀察-被觀察模型適用於這樣的情況,比方說根據A(資料類)的某個屬性值變化,B(view類)中的某個屬性做出相應變化。對於推崇MVC的cocoa而言,KVO應用的地方非常廣泛。(這樣的機制聽起來類似Notification,但是notification是需要一個傳送notification的物件,一般是notificationCenter,來通知觀察者。而KVO是直接通知到觀察物件。)

使用KVO時通常遵循如下的流程:

1、註冊觀察

[objc] view plain copy
 print?在CODE上檢視程式碼片派生到我的程式碼片
  1. - (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(voidvoid *)context;  

keyPath就是要觀察的屬性值,options給你觀察鍵值變化的選擇,而context方便傳輸你需要的資料(注意這是一個void型)

2、實現變化後的回撥方法 [objc] view plain copy
 print?在CODE上檢視程式碼片派生到我的程式碼片
  1. - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(voidvoid *)context  
change裡儲存了一些變化的資料,比如變化前的資料,變化後的資料;如果註冊時context不為空,這裡context就能接收到。

3、停止觀察

[objc] view plain copy
 print?在CODE上檢視程式碼片派生到我的程式碼片
  1. - (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath  

是不是覺得和NSNotificationCenter很類似,確實是有很多類似之處,都是需要註冊觀察和移除觀察等操作,可以對比著記憶。

說明示例:

建立一個每秒自動更新1000行的表格。

KVCTableViewCell.h

[objc] view plain copy  print?在CODE上檢視程式碼片派生到我的程式碼片
  1. @interface KVCTableViewCell : UITableViewCell  
  2. - (id)initWithReuseIdentifier:(NSString*)identifier;  
  3. @property (nonatomicreadwritestrongid object;  
  4. @property (nonatomicreadwritecopyNSString *property;  
  5. @end
[objc] view plain copy
 print?在CODE上檢視程式碼片派生到我的程式碼片
  1. @implementation KVCTableViewCell  
  2. - (BOOL)isReady {  
  3.   return (self.object && [self.property length] > 0);  
  4. }  
  5. - (void)update {  
  6.   self.textLabel.text = self.isReady ?  
  7.   [[self.object valueForKeyPath:self.property] description]  
  8.   : @"";  
  9. }  
  10. - (id)initWithReuseIdentifier:(NSString *)identifier {  
  11.   return [super initWithStyle:UITableViewCellStyleDefault  
  12.               reuseIdentifier:identifier];  
  13. }  
  14. <strong>- (void)removeObservation {  
  15.   if (self.isReady) {  
  16.     [self.object removeObserver:self
  17.                      forKeyPath:self.property];  
  18.   }  
  19. }  
  20. - (void)addObservation {  
  21.   if (self.isReady) {  
  22.     [self.object addObserver:self forKeyPath:self.property
  23.                      options:0
  24.                     

    相關推薦

    KVO KVC

    KVC 用 KVC 實現高階訊息傳遞 valueForKey: 有很多有用的特例,比如說 NSArray 和 NSSet 這樣的容器類都覆蓋了這個方法。valueForKey: 被傳遞給容器中得每一個物件,而不是對容器本身進行操作。結果會被新增進返回的

    關於 KVO KVC 的一些總結 以及使用KVC進行字典模型的互相轉換

    一直對KVO 和KVC都是停留在 只是知道的情況,從來沒有嘗試這在專案中使用,最近準備總結一下,在專案裡面簡單的使用一下 1、什麼是KVO? KVO其實就是Key-Value-Observer,也就是鍵值觀察者,是基於KVC機制實現的另一種模式。也許有不少同學用過SV

    KVO NSNotificationcenter addObserver removeObserve成對出現的原因

    最近在做平板的過程中,發現了一些很不規範的程式碼。偶然修復支付bug的時候,看到其他專案程式碼,使用通知的地方沒有移除,我以為我這個模組的支付閃退是因為他通知沒有移除的緣故。而在debug和看了具體的程式碼的時候才發現和這裡沒有關係。在我印象中,曾經因為沒有移除通知而遇到

    kvckvo的使用情況的了解

    sele enter acc 組合 ets 字符串 exp ace map 了解cocoa:Cocoa是蘋果公司為Mac OS X所創建的原生面向對象的API,是M

    iOS中 KVCKVO的理解用途

    KVC(Key-Value Coding) KVC,即是指 NSKeyValueCoding,一個非正式的 Protocol,提供一種機制來間接訪問物件的屬性。 一個物件擁有某些屬性。比如說,一個 Man 物件有一個 name 和一個 age 屬性。以 KVC 說法,這個Man&n

    KVCKVO

    前言 在網上找到一篇對KVO講的比較好的文章,原帖位置:https://www.objc.io/issues/7-foundation/key-value-coding-and-observing/,轉帖出來。 正文 Key-value coding and key-value obse

    OC學習篇之---KVCKVO操作

    一、KVC操作OC中的KVC操作就和Java中使用反射機制去訪問類的private許可權的變數,很暴力的,這樣做就會破壞類的封裝性,本來類中的的private許可權就是不希望外界去訪問的,但是我們這樣去操作,就會反其道而行,但是我們有時候真的需要去這樣做,哎。所以說有些事不是

    重點 (三) : KVC/KVO

    keyvalue val text 賬戶 數據模型 賦值 編程 不存在 用戶 由於ObjC主要基於Smalltalk進行設計,因此它有很多類似於Ruby、Python的動態特性,例如動態類型、動態加載、動態綁定等。今天我們著重介紹ObjC中的鍵值編碼(KVC)、鍵值監聽(K

    KVC/KVO 總結

    KVC Key-Value Coding基本原則 訪問物件屬性 @interface BankAccount: NSobject @property (nonatomic) NSNumber *currentBalance; // An attribute @property (nonatomic)

    iOS-知識梳理(觀察者模式-KVO、NSNotification的實現原理.KVC原理)

    觀察者模式的定義:一個目標物件管理所有依賴於它的觀察者物件,並在它自身的狀態改變時主動通知觀察者物件。這個主動通知通常是通過呼叫各觀察者物件所提供的介面方法來實現的。觀察者模式較完美地將目標物件與觀察者物件解耦。 KVO基於runtime實現,當你觀察一個物件的時候,一個新類被動態建立繼承於

    iOS KVCKVO簡介

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

    KVCKVO、RunTime、RunLoop

    KVC-->Key-Value Coding: 鍵值編碼 (KVC) 原理:KVC運用了一個isa-swizzling技術. isa-swizzling就是型別混合指標機制, 將2個物件的isa指標互相調換, 就是俗稱的黑魔法. KVC主要通過isa-swizzli

    iOS基礎知識整理之KVCKVO

    如何理解KVC? 在iOS中每一個物件的建立屬性的過程中,以KVC的角度理解會建立一個對應的鍵值對,這個鍵值對的key為設定的物件的屬性值,而對於該屬性的值為對應的value值。如果存在多層呼叫關係需要用到keypath來實現。如下Person型別實力物件有1

    窺探iOS底層實現-- KVO/KVC的本質

    窺探iOS底層實現--OC物件的本質(一) - 掘金 窺探iOS底層實現--OC物件的本質(二) - 掘金 窺探iOS底層實現--OC物件的分類:instance、class、meta-calss物件的isa和superclass - 掘金 窺探iOS底層實現-- KVO/KVC的本質 - 掘金 ..

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

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

    iOS攔截系統KVO監聽,防止多次刪除新增!!!Demo

    https://blog.csdn.net/jq2530469200/article/details/52484646最近專案中處理kvo 的時候,遇到一個問題:當我操作的時候,會發現kvo 釋放的時候,會崩潰, 崩潰日誌如下:/*Terminating app due to

    代理、nsnotificationkvo的區別用法

    個人在網上瀏覽一些文件發現蠻有意思的,現轉載下來供大家學習檢視。 1.效率肯定是delegate比nsnotification高。 2. delegate方法比notification更加直接。 最典型的特徵是,delegate方法往往需要關注返回值

    2-4 iOS KVC&KVO

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

    ios使用 KVC 修改textField的placeholder的字型顏色大小

    最近在看KVC和KVO,利用KVC實現了對textField的placeholder的字型顏色和大小的修改 [textField setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"]

    iOS 物件之間的通訊方式(delegate、block、NSNotification、kvckvo)總結

    有五種方式:delegate(代理)、block(程式碼塊)、NSNotification(通知)、kvc(鍵-值編碼)、kvo(​鍵值觀察模式) 1. delegate:代理是一種設計模式,它是通過被代理者定義代理協議委託代理者實現協議,用於兩個物件間的通訊互動。在