KVC查找順序
KVC(Key-Value Coding)在查找屬性值時會按照以下順序進行查找:
1. 直接訪問實例變量:KVC 首先嘗試直接訪問與屬性名相對應(yīng)的實例變量盔粹,如果找到則直接返回對應(yīng)的值。
2. 調(diào)用屬性的訪問方法:如果沒有找到與屬性名對應(yīng)的實例變量程癌,KVC 將嘗試調(diào)用屬性的訪問方法(getter)來獲取屬性的值舷嗡。KVC 默認(rèn)會按照一定的命名規(guī)則尋找屬性的訪問方法,例如對于名為 `name` 的屬性嵌莉,KVC 將嘗試調(diào)用 `name`进萄、`getName`、`isName`锐峭、`_name`中鼠、`_isName` 的方法,按照優(yōu)先級依次查找沿癞,找到第一個存在的訪問方法就會返回對應(yīng)的值援雇。
3. 訪問容器屬性的值:如果屬性是一個容器(如 NSArray、NSSet)椎扬,KVC 會進一步查找容器內(nèi)的對象的屬性熊杨。例如曙旭,如果有一個名為 `persons` 的屬性,它是一個包含多個 Person 對象的 NSArray晶府,可以使用 KVC 來訪問 `persons` 數(shù)組中所有對象的某個屬性桂躏。
4. 訪問集合運算符的值:KVC 提供了一些集合運算符(如 @avg、@sum川陆、@count剂习、@max、@min)较沪,可以在容器屬性上使用這些運算符獲取特定的值鳞绕。
5. 訪問內(nèi)部屬性:KVC 可以遞歸地訪問內(nèi)部屬性,例如訪問 `person.address.city` 這樣的屬性路徑尸曼,KVC 會依次查找 `person` 對象的 `address` 屬性们何,然后再在 `address` 對象上查找 `city` 屬性。
總結(jié):KVC 在查找屬性值時會先嘗試直接訪問實例變量控轿,然后調(diào)用屬性的訪問方法冤竹,接著查找容器屬性的值,再使用集合運算符茬射,最后遞歸地訪問內(nèi)部屬性鹦蠕。如果在以上步驟中找到了屬性的值,則返回對應(yīng)的值在抛;如果未找到钟病,則會拋出異常。
@avg刚梭、@sum肠阱、@count、@max朴读、@min
NSArray *numbers = @[@10, @20, @30, @40];
NSNumber *average = [numbers valueForKeyPath:@"@avg.self"];
NSLog(@"Average: %@", average); // Output: Average: 25
NSArray *numbers = @[@10, @20, @30, @40];
NSNumber *sum = [numbers valueForKeyPath:@"@sum.self"];
NSLog(@"Sum: %@", sum); // Output: Sum: 100
NSArray *array = @[@"Apple", @"Banana", @"Orange"];
NSNumber *count = [array valueForKeyPath:@"@count"];
NSLog(@"Count: %@", count); // Output: Count: 3
NSArray *numbers = @[@10, @20, @30, @40];
NSNumber *maxValue = [numbers valueForKeyPath:@"@max.self"];
NSLog(@"Max Value: %@", maxValue); // Output: Max Value: 40
NSArray *numbers = @[@10, @20, @30, @40];
NSNumber *minValue = [numbers valueForKeyPath:@"@min.self"];
NSLog(@"Min Value: %@", minValue); // Output: Min Value: 10
對比NSThread屹徘,NSOperation,GCD
功能 | NSThread | NSOperation | GCD |
---|---|---|---|
并發(fā)操作 | 需要手動創(chuàng)建和管理線程 | 使用NSOperationQueue管理操作隊列 | 使用dispatch_queue管理并發(fā)隊列 |
線程管理 | 需要手動管理線程生命周期 | 由NSOperationQueue管理線程生命周期 | 由GCD自動管理線程生命周期 |
任務(wù)依賴關(guān)系 | 不支持 | 支持 | 支持 |
取消操作 | 需要手動取消線程 | 可以通過取消操作對象來取消任務(wù) | 可以通過取消dispatch操作來取消任務(wù) |
任務(wù)優(yōu)先級 | 不支持 | 支持 | 支持 |
隊列類型 | 單一隊列 | NSOperationQueue支持串行和并發(fā)隊列 | dispatch_queue支持串行和并發(fā)隊列 |
線程同步 | 需要手動使用鎖來實現(xiàn)線程同步 | 支持使用NSLock磨德、NSCondition等進行線程同步 | 支持使用信號量缘回、互斥鎖等進行線程同步 |
錯誤處理 | 需要手動處理錯誤 | 支持通過設(shè)置completionBlock來處理錯誤 | 支持通過設(shè)置錯誤處理函數(shù)或回調(diào)來處理錯誤 |
可擴展性 | 受限于手動創(chuàng)建和管理線程的復(fù)雜性 | 支持自定義子類擴展操作 | 可以使用block來封裝自定義任務(wù)邏輯 |
編程模型 | 顯式線程管理吆视,需要手動編寫線程代碼 | 高級抽象典挑,提供操作對象和隊列來管理任務(wù) | 高級抽象,使用block和隊列來管理任務(wù) |
跨平臺支持 | 支持 | 支持 | 僅限于Apple平臺 |
總體而言啦吧,NSThread是較低級的線程管理方式您觉,需要手動創(chuàng)建和管理線程,靈活性較高但使用相對復(fù)雜授滓。NSOperation提供了更高級的抽象琳水,可以管理任務(wù)之間的依賴關(guān)系和優(yōu)先級肆糕,并提供更好的錯誤處理機制。GCD是一種輕量級的異步編程解決方案在孝,使用block和隊列來管理任務(wù)诚啃,具有高性能和簡潔的語法。NSOperation和GCD都是建立在NSThread之上的更高級別的抽象私沮,并提供更好的可讀性和可維護性始赎。
選擇適當(dāng)?shù)姆桨溉Q于具體的需求和項目要求。如果需要更底層的控制和靈活性仔燕,可以選擇NSThread造垛;如果需要更高級的任務(wù)管理和錯誤處理,以及跨平臺支持晰搀,可以選擇NSOperation五辽;如果追求簡潔性、高性能和易用性外恕,并且在Apple平臺上開發(fā)杆逗,可以選擇GCD。
下面是對常見的鎖的比較:
鎖類型 | 特點 | 使用場景 |
---|---|---|
OSSpinLock | 自旋鎖吁讨,忙等待 | 競爭不激烈髓迎、鎖持有時間短的情況下 |
pthread_mutex | 互斥鎖,阻塞等待 | 線程同步建丧、競爭激烈排龄、資源占用時間長的情況下 |
NSLock | Objective-C互斥鎖,阻塞等待 | 線程同步翎朱、Objective-C環(huán)境下 |
NSRecursiveLock | 可重入鎖橄维,同一線程可多次加鎖 | 遞歸調(diào)用、同一線程多次加鎖的情況下 |
NSCondition | 條件鎖拴曲,支持線程等待和喚醒 | 線程間通信争舞、線程同步 |
NSConditionLock | 條件鎖,支持多個條件和加鎖解鎖操作 | 多個條件的線程同步 |
dispatch_semaphore | 信號量鎖澈灼,控制并發(fā)數(shù)量 | 控制并發(fā)線程的數(shù)量 |
pthread_rwlock | 讀寫鎖竞川,支持多個讀者和單個寫者 | 讀寫分離場景 |
os_unfair_lock (iOS 10+) | 低級別自旋鎖,內(nèi)部優(yōu)化叁熔,比OSSpinLock更高效委乌,不會出現(xiàn)優(yōu)先級反轉(zhuǎn)問題 | 競爭不激烈、鎖持有時間短的情況下(iOS 10+及macOS 10.12+使用) |
atomic | 原子操作鎖荣回,提供基本的線程安全性 | 單一屬性的讀寫操作 |
選擇適當(dāng)?shù)逆i取決于具體的使用場景和需求遭贸。對于競爭不激烈、鎖持有時間短的情況心软,可以考慮使用輕量級的自旋鎖(如OSSpinLock壕吹、os_unfair_lock)著蛙。對于競爭激烈、資源占用時間長的情況耳贬,可以選擇互斥鎖(如pthread_mutex踏堡、NSLock)。如果需要支持線程等待和喚醒咒劲,可以使用條件鎖(如NSCondition)暂吉。讀寫分離場景可以考慮使用讀寫鎖(如pthread_rwlock)。在Objective-C環(huán)境下缎患,可以使用NSLock慕的、NSRecursiveLock等。在GCD中挤渔,可以使用dispatch_semaphore進行控制并發(fā)數(shù)量肮街。對于簡單的原子操作,可以使用atomic屬性來提供基本的線程安全性判导。
需要根據(jù)具體的需求和場景來選擇合適的鎖嫉父,避免死鎖、優(yōu)先級反轉(zhuǎn)等問題眼刃,并保證線程安全性和性能绕辖。
下面是對常見的數(shù)據(jù)存儲方式的比較:
數(shù)據(jù)存儲方式 | 特點 | 使用場景 |
---|---|---|
UserDefaults | 簡單的鍵值對存儲,適用于少量的用戶配置數(shù)據(jù) | 用戶配置擂红、偏好設(shè)置等 |
Property List | 使用plist文件存儲數(shù)據(jù)仪际,支持多種數(shù)據(jù)類型 | 小型數(shù)據(jù)、配置文件等 |
SQLite | 關(guān)系型數(shù)據(jù)庫存儲昵骤,支持復(fù)雜的查詢和事務(wù)操作 | 大量結(jié)構(gòu)化數(shù)據(jù)树碱、復(fù)雜查詢需求 |
Core Data | 面向?qū)ο蟮臄?shù)據(jù)存儲和管理框架,支持對象關(guān)系映射和多線程并發(fā) | 復(fù)雜數(shù)據(jù)模型变秦、需要對象關(guān)系映射的場景 |
Realm | 輕量級的移動數(shù)據(jù)庫成榜,支持快速讀寫和實時數(shù)據(jù)同步,對象映射簡單 | 移動端應(yīng)用蹦玫、需要高性能讀寫和實時同步的場景 |
Key-Value Store | 非關(guān)系型鍵值存儲赎婚,適用于大規(guī)模分布式系統(tǒng),支持快速讀寫和分布式存儲 | 大規(guī)模分布式系統(tǒng)樱溉、鍵值對存儲的需求 |
File System | 使用文件系統(tǒng)存儲數(shù)據(jù)挣输,靈活性高,可自定義數(shù)據(jù)結(jié)構(gòu)和存儲方式 | 大文件饺窿、自定義數(shù)據(jù)結(jié)構(gòu)的存儲需求 |
Network Storage | 數(shù)據(jù)存儲在網(wǎng)絡(luò)服務(wù)器上歧焦,通過網(wǎng)絡(luò)請求進行讀寫 | 分布式系統(tǒng)移斩、多端數(shù)據(jù)同步的需求 |
Cloud Storage | 數(shù)據(jù)存儲在云端肚医,可跨設(shè)備訪問和同步绢馍,提供云服務(wù)提供商的數(shù)據(jù)存儲服務(wù) | 跨設(shè)備訪問、數(shù)據(jù)同步和備份的需求 |
選擇適當(dāng)?shù)臄?shù)據(jù)存儲方式取決于具體的需求和場景肠套。如果只是存儲少量的用戶配置數(shù)據(jù)或偏好設(shè)置舰涌,可以使用UserDefaults。對于小型數(shù)據(jù)或配置文件你稚,可以選擇Property List瓷耙。如果需要復(fù)雜的查詢和事務(wù)操作,可以使用SQLite刁赖。Core Data適用于復(fù)雜的數(shù)據(jù)模型和對象關(guān)系映射需求搁痛。Realm提供了高性能讀寫和實時同步的特性,適用于移動端應(yīng)用宇弛。鍵值存儲適用于大規(guī)模分布式系統(tǒng)鸡典。如果需要自定義數(shù)據(jù)結(jié)構(gòu)和存儲方式,可以使用文件系統(tǒng)枪芒。網(wǎng)絡(luò)存儲和云存儲適用于分布式系統(tǒng)彻况、多端訪問和數(shù)據(jù)同步的需求。
需要根據(jù)具體的數(shù)據(jù)量舅踪、性能要求纽甘、查詢需求、并發(fā)性等因素綜合考慮抽碌,選擇合適的數(shù)據(jù)存儲方式悍赢。
比較[UIImage imageNamed:]
和[UIImage imageWithContentsOfFile:]
的使用和特性:
[UIImage imageNamed:] |
[UIImage imageWithContentsOfFile:] |
|
---|---|---|
使用方式 | 從應(yīng)用程序的資源包中加載圖像 | 從指定的文件路徑加載圖像 |
緩存 | 自動緩存圖像 | 不緩存圖像 |
內(nèi)存占用 | 可能由于緩存而消耗更多內(nèi)存 | 內(nèi)存占用較低,適用于大型或頻繁使用的圖像 |
文件路徑 | 不需要完整的文件路徑 | 需要完整的文件路徑 |
錯誤處理 | 如果找不到圖像名稱货徙,則返回nil
|
如果文件路徑無效或無法加載圖像泽裳,則返回nil
|
適用場景 | 應(yīng)用程序內(nèi)置圖像資源 | 大型圖像或特定的文件位置 |
如何從磁盤快速顯示圖片,SDWebImage做了什么破婆?
要從磁盤快速顯示圖片涮总,可以使用SDWebImage庫來實現(xiàn)。SDWebImage是一個廣泛使用的iOS圖片加載和緩存庫祷舀,它提供了許多功能來優(yōu)化圖片加載和顯示的性能瀑梗。
下面是SDWebImage的主要功能和它在從磁盤快速顯示圖片方面的工作原理:
下面是SDWebImage的主要功能以及它在從磁盤快速顯示圖片方面的工作原理的表格展示:
主要功能 | 工作原理 |
---|---|
異步下載和緩存網(wǎng)絡(luò)圖片 | 通過使用NSURLConnection或NSURLSession進行異步下載,然后將下載的圖片緩存在內(nèi)存和磁盤上 |
支持使用URL加載圖片 | 提供了便捷的API來從網(wǎng)絡(luò)上加載圖片裳扯,支持常見的圖片格式如JPEG抛丽、PNG、GIF等 |
自動管理圖片緩存 | SDWebImage會自動管理內(nèi)存和磁盤緩存饰豺,可以設(shè)置最大內(nèi)存緩存大小和最大磁盤緩存大小亿鲜,并根據(jù)需要自動清理緩存 |
圖片加載進度回調(diào) | 提供了加載進度回調(diào)的功能,可以監(jiān)測圖片加載的進度 |
支持占位圖和失敗圖 | 可以設(shè)置占位圖,當(dāng)圖片還在加載時顯示蒿柳;同時還可以設(shè)置失敗圖饶套,當(dāng)加載圖片失敗時顯示 |
支持內(nèi)存緩存和磁盤緩存控制 | 可以通過設(shè)置緩存策略和過期時間來控制內(nèi)存緩存和磁盤緩存的行為 |
支持取消圖片下載任務(wù) | 提供了取消圖片下載任務(wù)的方法,可以在需要時取消正在進行的圖片下載任務(wù) |
集成了UIImageView的擴展方法 | 提供了方便的UIImageView擴展方法垒探,可以直接加載網(wǎng)絡(luò)圖片到UIImageView對象中 |
支持自定義圖片加載和緩存策略 | 可以通過自定義SDWebImageManager來實現(xiàn)自定義的圖片加載和緩存策略 |
使用內(nèi)存和磁盤緩存加速從磁盤快速顯示圖片 | 當(dāng)從磁盤加載圖片時妓蛮,SDWebImage會首先檢查內(nèi)存緩存,如果內(nèi)存中有緩存的圖片圾叼,則直接加載蛤克;如果內(nèi)存中沒有,則從磁盤緩存中加載圖片 |