iOS總結(jié)

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)存中沒有,則從磁盤緩存中加載圖片
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末夷蚊,一起剝皮案震驚了整個濱河市构挤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惕鼓,老刑警劉巖儿倒,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異呜笑,居然都是意外死亡夫否,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門叫胁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凰慈,“玉大人,你說我怎么就攤上這事驼鹅∥⑽剑” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵输钩,是天一觀的道長豺型。 經(jīng)常有香客問我,道長买乃,這世上最難降的妖魔是什么姻氨? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮剪验,結(jié)果婚禮上肴焊,老公的妹妹穿的比我還像新娘。我一直安慰自己功戚,他們只是感情好娶眷,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著啸臀,像睡著了一般届宠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天豌注,我揣著相機與錄音伤塌,去河邊找鬼。 笑死幌羞,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的竟稳。 我是一名探鬼主播属桦,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼他爸!你這毒婦竟也來了聂宾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤诊笤,失蹤者是張志新(化名)和其女友劉穎系谐,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體讨跟,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡纪他,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了晾匠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茶袒。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖凉馆,靈堂內(nèi)的尸體忽然破棺而出薪寓,到底是詐尸還是另有隱情,我是刑警寧澤澜共,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布向叉,位于F島的核電站,受9級特大地震影響嗦董,放射性物質(zhì)發(fā)生泄漏母谎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一京革、第九天 我趴在偏房一處隱蔽的房頂上張望销睁。 院中可真熱鬧,春花似錦存崖、人聲如沸冻记。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冗栗。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間隅居,已是汗流浹背钠至。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留胎源,地道東北人棉钧。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像涕蚤,于是被迫代替她去往敵國和親宪卿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1万栅、iOS代碼規(guī)范 https://developer.apple.com/library/archive/rel...
    張小明閱讀 1,105評論 0 0
  • iOS中持久化方式有哪些佑钾? NSUserDefaults 的存儲,實際是本地生成一個 plist 文件烦粒,將所需屬性...
    Y了個J閱讀 359評論 0 0
  • 1.上傳一組圖片的時候可使用dispatch_group_t休溶,將每一個圖片的上傳添加到組中,后續(xù)可以匯總所有圖片上...
    夢中回音閱讀 470評論 0 0
  • 1扰她、為什么說Objective-C是一門動態(tài)的語言兽掰?答:什么叫動態(tài)靜態(tài)->靜態(tài)、動態(tài)是相對的徒役,這里動態(tài)語言指的是不...
    coder1003閱讀 494評論 0 1
  • 1禾进、遞歸反轉(zhuǎn)字符串 (void)testReserveStr {NSLog(@"--%@", [self func...
    行走在北方閱讀 583評論 0 4