KVO 和 KVC
KVC
- 用 KVC 實現高階訊息傳遞
valueForKey: 有很多有用的特例,比如說 NSArray 和 NSSet 這樣的容器類都覆蓋了這個方法。valueForKey: 被傳遞給容器中得每一個物件,而不是對容器本身進行操作。結果會被新增進返回的容器中。這樣,開發者能很方便的用一個容器建立另一個容器物件,比如像這樣:
[objc] view plain copyprint?
- NSArray *array = @[@"foo",@"bar",@"baz"];
-
NSArray *capitals = [array valueForKey
方法 capitalizedString 被傳遞給 NSArray 中的每一項,並返回一個包含結果的新 NSArray 。把訊息(capitalizedString)作為引數傳遞稱為高階訊息傳遞(Higher Order Messaging)。多個訊息可以用鍵路徑傳遞:
[objc] view plain copyprint?
- NSArray *array = @[@"foo",@"bar",@"baz"];
-
NSArray *capitalLengths = [array valueForKeyPath
以上程式碼對 array 的每一個元素呼叫 capitalizedString ,然後呼叫 length ,在把返回值封裝進 NSNumber 物件。結果被收集進名為 capitalLengths 的新陣列。
- 容器操作符
KVC 還提供了很複雜的函式,比如說自動對一組數字求和或者求平均值。看一下這個例子:
[objc] view plain copyprint?
- NSArray *array = @[@"foo",@"bar",@"baz"];
-
NSUInteger totalLenth = [[array valueForKeyPath
@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 copyprint?
- - (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(voidvoid *)context;
keyPath就是要觀察的屬性值,options給你觀察鍵值變化的選擇,而context方便傳輸你需要的資料(注意這是一個void型)
print?
- - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(voidvoid *)context
3、停止觀察
[objc] view plain copyprint?
- - (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath
是不是覺得和NSNotificationCenter很類似,確實是有很多類似之處,都是需要註冊觀察和移除觀察等操作,可以對比著記憶。
說明示例:
建立一個每秒自動更新1000行的表格。
KVCTableViewCell.h
[objc] view plain copy print?- @interface KVCTableViewCell : UITableViewCell
- - (id)initWithReuseIdentifier:(NSString*)identifier;
- @property (nonatomic, readwrite, strong) id object;
- @property (nonatomic, readwrite, copy) NSString *property;
- @end
print?
- @implementation KVCTableViewCell
- - (BOOL)isReady {
- return (self.object && [self.property length] > 0);
- }
- - (void)update {
- self.textLabel.text = self.isReady ?
- [[self.object valueForKeyPath:self.property] description]
- : @"";
- }
- - (id)initWithReuseIdentifier:(NSString *)identifier {
- return [super initWithStyle:UITableViewCellStyleDefault
- reuseIdentifier:identifier];
- }
- <strong>- (void)removeObservation {
- if (self.isReady) {
- [self.object removeObserver:self
- forKeyPath:self.property];
- }
- }
- - (void)addObservation {
- if (self.isReady) {
- [self.object addObserver:self forKeyPath:self.property
- options:0
-
相關推薦
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和看了具體的程式碼的時候才發現和這裡沒有關係。在我印象中,曾經因為沒有移除通知而遇到
kvc和kvo的使用情況的了解
sele enter acc 組合 ets 字符串 exp ace map 了解cocoa:Cocoa是蘋果公司為Mac OS X所創建的原生面向對象的API,是M
iOS中 KVC和KVO的理解和用途
KVC(Key-Value Coding) KVC,即是指 NSKeyValueCoding,一個非正式的 Protocol,提供一種機制來間接訪問物件的屬性。 一個物件擁有某些屬性。比如說,一個 Man 物件有一個 name 和一個 age 屬性。以 KVC 說法,這個Man&n
KVC和KVO
前言 在網上找到一篇對KVO講的比較好的文章,原帖位置:https://www.objc.io/issues/7-foundation/key-value-coding-and-observing/,轉帖出來。 正文 Key-value coding and key-value obse
OC學習篇之---KVC和KVO操作
一、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 KVC與KVO簡介
級別: ★★☆☆☆ 標籤:「iOS」「KVC」「KVO」 作者: dac_1033 審校: QiShare團隊 一、 KVC 1.1 KVC介紹 KVC是Key Value Coding的縮寫,即 鍵值編碼。 在iOS的開發中,可以通過key名直接訪問例項物件的屬性,而不需要呼叫明確的存取方法
KVC、KVO、RunTime、RunLoop
KVC-->Key-Value Coding: 鍵值編碼 (KVC) 原理:KVC運用了一個isa-swizzling技術. isa-swizzling就是型別混合指標機制, 將2個物件的isa指標互相調換, 就是俗稱的黑魔法. KVC主要通過isa-swizzli
iOS基礎知識整理之KVC與KVO
如何理解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
代理、nsnotification和kvo的區別和用法
個人在網上瀏覽一些文件發現蠻有意思的,現轉載下來供大家學習檢視。 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、kvc、kvo)總結
有五種方式:delegate(代理)、block(程式碼塊)、NSNotification(通知)、kvc(鍵-值編碼)、kvo(鍵值觀察模式) 1. delegate:代理是一種設計模式,它是通過被代理者定義代理協議委託代理者實現協議,用於兩個物件間的通訊互動。在