探索iOS中的KVC

目錄

前言

1.iOS中的KVC(鍵值編碼)

1. 什么是KVC?

2. 使用KVC

1.設置屬性值

2.獲取屬性值

3. KVC的高級用法

1.訪問私有屬性

2.訪問集合屬性

4. KVC的安全性

5. KVC原理

1. 查找順序

2. 設置值

6.參考文章


前言

? ? ? ? 這篇文章主要是介紹KVC的用法。

1.iOS中的KVC(鍵值編碼)

????????在iOS開發中,KVC(Key-Value Coding,鍵值編碼)是一種強大的機制,使得我們能夠通過字符串鍵來訪問對象的屬性。KVC在許多iOS框架和技術中扮演著關鍵角色,包括Core Data、Cocoa Bindings以及KVO(Key-Value Observing,鍵值觀察)。

1. 什么是KVC?

????????KVC是一種間接訪問對象屬性的方法。通常,我們通過屬性的getter和setter方法來訪問或修改對象的屬性。但使用KVC,我們可以通過字符串鍵來訪問這些屬性,這使得代碼更加靈活和動態。

2. 使用KVC

????????KVC主要通過setValue:forKey和valueForKey:方法來實現。

1.設置屬性值

#import <Foundation/Foundation.h>@interface Person : NSObject@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age;@end@implementation Person
@endint main(int argc, const char * argv[]) {@autoreleasepool {Person *person = [[Person alloc] init];// 使用KVC設置屬性值[person setValue:@"John" forKey:@"name"];[person setValue:@30 forKey:@"age"];NSLog(@"Name: %@", person.name);NSLog(@"Age: %ld", (long)person.age);}return 0;
}

2.獲取屬性值

int main(int argc, const char * argv[]) {@autoreleasepool {Person *person = [[Person alloc] init];[person setValue:@"John" forKey:@"name"];[person setValue:@30 forKey:@"age"];// 使用KVC獲取屬性值NSString *name = [person valueForKey:@"name"];NSNumber *age = [person valueForKey:@"age"];NSLog(@"Name: %@", name);NSLog(@"Age: %@", age);}return 0;
}

3. KVC的高級用法

1.訪問私有屬性

????????KVC不僅可以訪問公共屬性,還可以訪問私有屬性。盡管這是KVC的一個強大功能,但在實際開發中要謹慎使用。

@interface Person ()@property (nonatomic, strong) NSString *secret;@end@implementation Person
@endint main(int argc, const char * argv[]) {@autoreleasepool {Person *person = [[Person alloc] init];// 使用KVC訪問私有屬性[person setValue:@"This is a secret" forKey:@"secret"];NSString *secret = [person valueForKey:@"secret"];NSLog(@"Secret: %@", secret);}return 0;
}

2.訪問集合屬性

????????KVC還提供了一些便捷方法來訪問集合類型的屬性,如數組和字典。

@interface Group : NSObject@property (nonatomic, strong) NSArray<Person *> *members;@end@implementation Group
@endint main(int argc, const char * argv[]) {@autoreleasepool {Person *person1 = [[Person alloc] init];[person1 setValue:@"Alice" forKey:@"name"];[person1 setValue:@25 forKey:@"age"];Person *person2 = [[Person alloc] init];[person2 setValue:@"Bob" forKey:@"name"];[person2 setValue:@28 forKey:@"age"];Group *group = [[Group alloc] init];group.members = @[person1, person2];// 使用KVC訪問集合屬性NSArray *names = [group valueForKeyPath:@"members.name"];NSLog(@"Names: %@", names);}return 0;
}

4. KVC的安全性

????????使用KVC時需要注意一些安全性問題,例如:
????????- 如果指定的鍵不存在,KVC會拋出一個異常。
????????- 訪問或修改私有屬性可能違反封裝性原則。

????????因此,使用KVC時要確保鍵的正確性,并且要對可能出現的異常進行適當的處理。

5. KVC原理

????????KVC 的實現主要依賴于以下幾個方面:

1. 查找順序

? ? ?????????當通過 `valueForKey:` 獲取值時,KVC 按以下順序查找屬性:

  1. Getter 方法:首先查找與鍵對應的 getter 方法。例如,對于鍵 `name`,查找 `getName`、`name` 或 `isName` 方法。
  2. ?實例變量:如果沒有找到合適的 getter 方法,則查找以鍵命名的實例變量 `_name` 或 `name`
  3. ? -accessInstanceVariablesDirectly:如果前兩個查找都失敗,KVC 會調用 `accessInstanceVariablesDirectly` 方法,該方法返回 YES 表示可以直接訪問實例變量。

2. 設置值

????????當通過setValue:forKey:設置值時,KVC 按以下順序查找屬性:

  1. Setter 方法:首先查找與鍵對應的 setter 方法。例如,對于鍵 name,查找 setName:?方法。
  2. 實例變:如果沒有找到合適的 setter 方法,則查找以鍵命名的實例變量_name或 name
  3. setValue:forUndefinedKey:如果前兩個查找都失敗,KVC 會調用 `setValue:forUndefinedKey:` 方法,該方法通常會拋出一個異常。

#### KVC 的查找規則示例

@interface Person : NSObject {NSString *_name;
}
@property (nonatomic, strong) NSString *name;
@end@implementation Person
@end

當調用 `[person valueForKey:@"name"]` 時,KVC 的查找順序如下:

1. 查找 `- (NSString *)name` 方法。
2. 查找 `- (NSString *)getName` 方法。
3. 查找 `- (NSString *)isName` 方法。
4. 查找實例變量 `_name` 和 `name`。
5. 調用 `accessInstanceVariablesDirectly` 方法,返回 YES,直接訪問 `_name`。

當調用 [person setValue:@"John" forKey:@"name"]?時,KVC 的查找順序如下:

1. 查找 - (void)setName:(NSString *)name?方法。
2. 查找實例變量 `_name` 和 `name`。
3. 調用 `setValue:forUndefinedKey:` 方法。

6.參考文章

1.Key-Value Coding Programming Guide: About Key-Value Coding

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/13651.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/13651.shtml
英文地址,請注明出處:http://en.pswp.cn/web/13651.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

UbuntuLinux系統下安裝wrk和使用

前言 wrk是一個用c語言寫的壓力測試工具&#xff0c;非常有用&#xff0c;但是ubuntu的軟件倉庫沒有收錄wrk&#xff0c;需要我們自己進行編譯和安裝&#xff0c;最近在學習一些性能測試、性能優化方面的知識&#xff0c;需要使用到這個強有力的工具&#xff0c;故此記錄安裝和…

Windows安全應急--在應急響應中需要知道的信息

在網絡安全事件發生后&#xff0c;一般是要去客戶現場排查問題的&#xff0c; 那么要想解決問題&#xff0c;信息的完整性決定了這次任務的成敗。。 1. 你需要知道的&#xff1a; 先讓客戶梳理一遍事情的起因經過結果 詢問客戶需要解決的問題 了解客戶的網絡環境&#xff08…

【ARM 嵌入式 C 入門及漸進 6.2 -- ARMv8 C 內嵌匯編讀系統寄存器的函數實現】

請閱讀【嵌入式開發學習必備專欄】 文章目錄 ARMv8 C 內嵌匯編讀系統寄存器 ARMv8 C 內嵌匯編讀系統寄存器 要在ARMv8架構中通過C代碼和內嵌匯編來讀取系統寄存器s3_0_c15_c5_5的值&#xff0c;并將其返回&#xff0c;可以按照以下方式實現system_read_reg函數&#xff1a; #…

buuctf的RSA(二)

1.RSA 知道 flag.enc 和 pub.key&#xff0c;典型的加密、解密 將pub,key 改為pub.txt 打開后發現公鑰 在RSA公私鑰分解 Exponent、Modulus&#xff0c;Rsa公私鑰指數、系數(模數)分解--查錯網 進行解密 得到e65537 n8693448229604811919066606200349480058890565…

innerText和innerHTML的區別

innerHTML和innerText都是元素的屬性&#xff0c;通過修改這個元素的屬性可以達到修改元素內容的目的。但是二者之間略有不同。具體來說&#xff0c;它們的區別如下&#xff1a; innerHTML可以獲取或設置元素內部的HTML內容&#xff0c;包括HTML標簽&#xff0c;而innerText則…

LeetCode 79.單詞搜索

原題鏈接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 給定一個 m x n 二維字符網格 board 和一個字符串單詞 word 。如果 word 存在于網格中&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 。 單詞必須按照字母順序&#xff0c;通過相鄰的單元格內…

若依前后端分離版本-前后端交互整理

ruoyi-ui與后端交互 方法一&#xff1a;表單 使用 headers: {Content-Type:application/x-www-form-urlencoded}, ruoyi-ui的vue中 //ruoyi-ui的vue中定義 formData: {a: 111,b: 111,c: 1,}, //vue中方法調用 outBound() { empty(this.formData).…

6款網頁表白代碼6(附帶源碼)

6款網頁表白代碼6 前言效果圖及部分源碼1.愛心倒計時2.一起看星星3.愛心4.愛心&#xff08;有鼠標移動特效&#xff09;5.愛心&#xff08;高級效果&#xff09;6.愛心&#xff08;3D效果&#xff09; 領取源碼下期更新預報 前言 大部分人都有喜歡的人&#xff0c;學會這些表白…

藍橋杯物聯網競賽_STM32L071KBU6_關于sizo of函數產生的BUG

首先現象是我在用LORA發送信息的時候&#xff0c;左邊顯示長度是8而右邊接收到的數據長度卻是4 我以為是OLED顯示屏壞了&#xff0c;又或者是我想搞創新用了const char* 類型強制轉換數據的原因&#xff0c;結果發現都不是 void Function_SendMsg( unsigned char* data){unsi…

微軟Edge

微軟Edge瀏覽器概述 功能介紹 微軟Edge是一款基于Chromium開源項目的網頁瀏覽器&#xff0c;旨在提供更快的網頁加載速度、更高的安全性和更好的用戶體驗。它支持多種操作系統&#xff0c;包括Windows、macOS、Android和iOS&#xff0c;能夠滿足不同用戶的需求。Edge瀏覽器擁…

趕緊收藏!2024 年最常見 20道 Redis面試題(三)

上一篇地址&#xff1a;趕緊收藏&#xff01;2024 年最常見 20道 Redis面試題&#xff08;二&#xff09;-CSDN博客 五、Redis的持久化機制是什么&#xff1f; Redis 是一個高性能的鍵值存儲系統&#xff0c;支持多種類型的數據結構&#xff0c;如字符串、哈希、列表、集合、…

python數據類型之字符串

目錄 1.字符串概念和注意事項 2.字符串內置函數 3.字符串的索引、切片和遍歷 4.字符串運算符 5.字符串常用方法 性質判斷 開頭結尾判斷 是否存在某個子串 大小寫等格式轉化 子串替換 刪除兩端空白字符 格式化字符串 分割與合并 6.字符串模板 7.exec 函數 8.字符…

【Linux】-Zookeeper安裝部署[17]

簡介 apache ZooKeeper是一個分布式的&#xff0c;開放源碼的分布式應用程序協調服務&#xff0c;是Hadoop和Hbase的重要組件。它是一個為分布式應用提供一致性服務的軟件&#xff0c;提供的功能包括&#xff1a;配置維護、域名服務、分布式同步、組服務等。 除了為Hadoop和H…

2024最新 Jenkins + Docker 實戰教程(四) - 編寫自己的Springboot項目實現自動化部署

&#x1f604; 19年之后由于某些原因斷更了三年&#xff0c;23年重新揚帆起航&#xff0c;推出更多優質博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有堅忍不拔之志 &#x1f390; 個人CSND主頁——Mi…

VMware Num Lock 總自動切換的問題解決

VMware Num Lock 總自動切換的問題解決 0. 問題描述1. 解決方法 0. 問題描述 使用 VMware 虛擬機時&#xff0c;鼠標在 VMware 和主機之間切換時&#xff0c;總是顯示 “Num Lock 開” 和 “Num Lock 關” 的提示框。 1. 解決方法 在 VMware 系統中&#xff0c;按 fn num 統…

0407放大電路的頻率響應

放大電路的頻率響應 單時間常數RC電路的頻率響應中頻響應高頻響應低頻響應全頻域響應 放大電路頻率響應概述1. 直接耦合放大電路頻域響應阻容耦合放大電路頻域響應 4.7.1 單時間常數RC電路的頻率響應 4.7.2 放大電路頻率響應概述 4.7.3 單級共射極放大電路的頻率響應 4.7.4 單級…

TOSHIBA UTLH21 屬于Unifi NV系列

TOSHIBA UTLH21 是東芝推出的一款工業控制器&#xff0c;屬于Unifi NV系列。 這款控制器代表了東芝在工業自動化領域的一次重要進步&#xff0c;它在功能和性能上都超越了現有的V系列控制器。以下是UTLH21的一些主要特點&#xff1a; 高速邏輯與控制能力&#xff1a;UTLH21具…

Spring框架中獲取方法參數名稱:DefaultParameterNameDiscoverer

DefaultParameterNameDiscoverer 是Spring框架中用于獲取方法參數名稱的一個類。在Java中&#xff0c;方法的參數名稱通常在編譯時會丟失&#xff0c;因為Java字節碼并不強制要求保留這些信息。Spring提供了一種機制來恢復這些參數名稱&#xff0c;這就是通過DefaultParameterN…

IT行業的現狀與未來趨勢

這里寫目錄標題 一、引言二、IT行業的現狀三、IT行業面臨的挑戰四、IT行業的未來趨勢五、結論 一、引言 信息技術&#xff08;IT&#xff09;行業在過去幾十年中經歷了飛速發展&#xff0c;從早期的計算機硬件和軟件開發&#xff0c;到如今涵蓋云計算、人工智能、大數據、物聯…

深度學習之基于Django+Tensorflow卷積神經網絡實時口罩檢測系統

歡迎大家點贊、收藏、關注、評論啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代碼。 文章目錄 一項目簡介 二、功能三、系統四. 總結 一項目簡介 一、項目背景 隨著全球疫情的持續&#xff0c;佩戴口罩成為了公眾日常生活中不可或缺的一部分。特別是在人員密集的…