1.組件化開(kāi)發(fā)的設(shè)計(jì)和使用
將應(yīng)用程序的功能分解為多個(gè)獨(dú)立的模塊或組件瞳遍,每個(gè)模塊負(fù)責(zé)一個(gè)特定的功能或業(yè)務(wù)邏輯闻妓,如用戶(hù)管理菌羽、網(wǎng)絡(luò)請(qǐng)求掠械、UI 組件等。
組件化的核心思想是降低模塊之間的耦合性注祖,使得每個(gè)模塊可以獨(dú)立存在和運(yùn)行猾蒂。模塊之間通過(guò)明確的接口(如協(xié)議、API)進(jìn)行通信是晨,而不直接依賴(lài)其他模塊的具體實(shí)現(xiàn)肚菠。
組件化的模塊是高度可重用的,能夠在多個(gè)項(xiàng)目或不同的應(yīng)用中使用罩缴,減少重復(fù)代碼的編寫(xiě)蚊逢,提高開(kāi)發(fā)效率。
2.Class類(lèi)的底層機(jī)構(gòu)是什么樣的
在oc中箫章,class 是一個(gè)指向objc_calss 結(jié)構(gòu)體的指針烙荷,objc_class結(jié)構(gòu)體定義了一個(gè)對(duì)象的布局,其核心結(jié)構(gòu)如下:
struct objc_class {
Class isa; // 指向類(lèi)對(duì)象的指針
Class superclass; // 指向父類(lèi)的指針
void *cache; // 方法緩存
void *vtable; // 虛函數(shù)表(可選)
struct class_ro_t *ro; // 只讀數(shù)據(jù)檬寂,包括類(lèi)名终抽、方法列表等
};
關(guān)鍵字段解析
- isa 指正指向類(lèi)的元類(lèi),
- supercalss 指針指向該類(lèi)的父類(lèi)桶至。如果該類(lèi)是根類(lèi)(如 NSObject)則為nil,這個(gè)字段用于實(shí)現(xiàn)類(lèi)的繼承機(jī)制
- cache 用于緩存最近調(diào)用的方法昼伴,方法緩存的是一個(gè)哈希表結(jié)構(gòu),他可以加速放的查找過(guò)程镣屹,避免每次方法調(diào)用都遍歷整個(gè)方法列表圃郊,方法緩存是根據(jù)使用頻率動(dòng)態(tài)維護(hù)的
- vtable 是一個(gè)可選的虛函數(shù)表,存儲(chǔ)了類(lèi)的虛函數(shù)地址女蜈,
- ro(read-only Data) ro是一個(gè)指向class_ro_t結(jié)構(gòu)體的指針描沟,class_ro_t結(jié)構(gòu)體包含了與類(lèi)相關(guān)的只讀數(shù)據(jù)飒泻,例如類(lèi)名嗎,方法列表吏廉,協(xié)議列表泞遗,屬性列表等。
3.類(lèi)A 席覆,有個(gè)分類(lèi)史辙,分類(lèi)的方法和原有的的方法是怎么存儲(chǔ)的,如果多個(gè)分類(lèi)有同一個(gè)方法佩伤,怎么判斷誰(shuí)的優(yōu)先級(jí)更高聊倔?
每個(gè)類(lèi)都有個(gè)方法列表,存儲(chǔ)在class_ro_t *ro里面生巡,存儲(chǔ)了這個(gè)類(lèi)的所有方法耙蔑,包括實(shí)例方法和類(lèi)方法,當(dāng)你為某個(gè)類(lèi)創(chuàng)建一個(gè)分類(lèi)的時(shí)候并定義方法的時(shí)候孤荣,這些方法會(huì)被添加到該類(lèi)的方法列表中甸陌,當(dāng)分類(lèi)被加載時(shí),這個(gè)方法會(huì)被插入到類(lèi)的方法列表中盐股。
當(dāng)多個(gè)分類(lèi)定義了想通的方法名時(shí)钱豁,最后一個(gè)加載的分類(lèi)方法實(shí)現(xiàn)會(huì)覆蓋之前的實(shí)現(xiàn)。
分類(lèi)是按照他們被編譯和鏈接的順序一次加載的疯汁,最后加載的分類(lèi)方法會(huì)覆蓋之前的同名方法牲尺,且優(yōu)先級(jí)最高。
由于加載順序的不可控幌蚊,這種做法會(huì)導(dǎo)致方法的實(shí)現(xiàn)不可預(yù)測(cè)谤碳,最好創(chuàng)建分類(lèi)時(shí)確保方法名的唯一性。
4溢豆,常用的線(xiàn)程鎖有哪些
- NSLock 互斥鎖蜒简,防止多個(gè)線(xiàn)程同時(shí)訪(fǎng)問(wèn)。
- NSRecursiveLock ,遞歸鎖沫换,允許同一線(xiàn)程多次獲取鎖而不會(huì)導(dǎo)致死鎖臭蚁,適用于遞歸調(diào)用。
- NSCondition讯赏,是一種鎖和條件變量相結(jié)合的對(duì)象垮兑,用于線(xiàn)程間得通信,可以用來(lái)等待或發(fā)送信號(hào)來(lái)控制線(xiàn)程的執(zhí)行漱挎。
- NSConditionLock系枪,是一種條件鎖,允許線(xiàn)程滿(mǎn)足某個(gè)條件時(shí)加鎖或者解鎖磕谅。
- @synchronized oc 語(yǔ)法糖私爷,方便的在塊級(jí)作用域內(nèi)使用雾棺,可用于對(duì)象加鎖,確保只有一個(gè)線(xiàn)程在同一時(shí)間訪(fǎng)問(wèn)代碼塊
- dispatch_semaphore GCD 的信號(hào)量機(jī)制衬浑,
- OSSPinklock捌浩,自旋鎖,用于某些情況下工秩,存在優(yōu)先級(jí)反轉(zhuǎn)的問(wèn)題尸饺,已經(jīng)廢棄
5,block 有幾種助币,分別對(duì)應(yīng)什么使用場(chǎng)景
- 全局block (Global block)通常用于不依賴(lài)外部變量的回調(diào)或處理邏輯浪听,比如常量的回調(diào)
void (^globalBlock)(void) = ^{
NSLog(@"This is a global block.");
};
- 棧block (Statck Block)
當(dāng)block 捕獲了外部自動(dòng)變量,默認(rèn)創(chuàng)建在棧中眉菱,隨著作用于的結(jié)束而銷(xiāo)毀迹栓。
適用于當(dāng)前作用域的的臨時(shí)操作,例如函數(shù)內(nèi)部的邏輯處理 - 堆block (Heap Block)
當(dāng)棧block 復(fù)制到堆中時(shí)俭缓,其生命周期克伊,不在受作用域的限制,直到不再有引用時(shí)釋放尔崔,
適用于長(zhǎng)時(shí)間存活或者跨多個(gè)作用域使用的操作答毫,比如異步操作中的回調(diào)褥民,延遲執(zhí)行等
6.struct 和 class 的區(qū)別
- 內(nèi)存分配 和存儲(chǔ)
st是值類(lèi)型季春,通常存儲(chǔ)在棧上,賦值或者參數(shù)傳遞是是值傳遞
class 是引用類(lèi)型消返,通常存儲(chǔ)在堆上载弄,賦值或者參數(shù)傳遞是地址的引用 ,通過(guò)引用計(jì)數(shù)進(jìn)行管理 - 繼承 和 多態(tài)撵颊,
st 不支持宇攻,不支持多態(tài)
clas 支持,支持多態(tài)倡勇,可以用父類(lèi)的引用只想子類(lèi)實(shí)例 - 使用場(chǎng)景
st適用于數(shù)據(jù)模型逞刷,表示輕量級(jí)的數(shù)據(jù)結(jié)構(gòu)或者不需要繼承和復(fù)雜行為的模型,例如坐標(biāo)顏色形狀等
class 適用于復(fù)雜的對(duì)象妻熊,特別哪些需要共享 修改夸浅,后者繼承多態(tài)的場(chǎng)景
7,swift 的消息派發(fā)方式有哪些
消息的派發(fā)方式主要有三種:直接派發(fā)、表派發(fā) 和 消息派發(fā)扔役。
- 直接派發(fā)是最簡(jiǎn)單帆喇、最快的派發(fā)方式。編譯器在編譯時(shí)就確定了要調(diào)用的方法亿胸,并在運(yùn)行時(shí)直接調(diào)用這個(gè)方法坯钦,不需要任何額外的查找
適用于 struct预皇、enum 以及用 final 修飾的 class 或 class 方法。這些類(lèi)型和方法在編譯時(shí)已經(jīng)確定婉刀,且不會(huì)被重寫(xiě)或繼承吟温。 - 表派發(fā)通過(guò)虛函數(shù)表(V-Table)來(lái)實(shí)現(xiàn)。當(dāng)一個(gè)類(lèi)有繼承關(guān)系時(shí)突颊,編譯器會(huì)為其生成一個(gè)虛函數(shù)表溯街,這個(gè)表記錄了類(lèi)及其父類(lèi)的所有方法的指針。在運(yùn)行時(shí)洋丐,通過(guò)查找表來(lái)確定調(diào)用哪個(gè)方法呈昔。
適用于沒(méi)有用 final 修飾的類(lèi)(class)或方法(非 final 方法),這些方法可能會(huì)被子類(lèi)重寫(xiě)友绝。 - 消息派發(fā)主要存在于 Objective-C 的類(lèi)(@objc 修飾的類(lèi)或方法)中堤尾。它使用動(dòng)態(tài)消息傳遞機(jī)制,即在運(yùn)行時(shí)通過(guò)查找方法列表來(lái)確定要調(diào)用的方法迁客。這種方式是 Objective-C 中的默認(rèn)派發(fā)方式郭宝。
適用于用 @objc 修飾的類(lèi)或方法,以及所有繼承自 Objective-C 的類(lèi)掷漱。這些方法可以在運(yùn)行時(shí)被替換或攔截(比如通過(guò) Method Swizzling)粘室。