iOS 面試記錄

1.組件化開發(fā)的設計和使用

將應用程序的功能分解為多個獨立的模塊或組件,每個模塊負責一個特定的功能或業(yè)務邏輯,如用戶管理、網絡請求、UI 組件等。
組件化的核心思想是降低模塊之間的耦合性,使得每個模塊可以獨立存在和運行。模塊之間通過明確的接口(如協(xié)議、API)進行通信,而不直接依賴其他模塊的具體實現(xiàn)。
組件化的模塊是高度可重用的,能夠在多個項目或不同的應用中使用,減少重復代碼的編寫,提高開發(fā)效率。

2.Class類的底層機構是什么樣的

在oc中,class 是一個指向objc_calss 結構體的指針,objc_class結構體定義了一個對象的布局,其核心結構如下:

struct objc_class {
   Class isa;                   // 指向類對象的指針
   Class superclass;            // 指向父類的指針
   void *cache;                 // 方法緩存
   void *vtable;                // 虛函數(shù)表(可選)
   struct class_ro_t *ro;       // 只讀數(shù)據(jù),包括類名、方法列表等
};

關鍵字段解析

  • isa 指正指向類的元類,
  • supercalss 指針指向該類的父類。如果該類是根類(如 NSObject)則為nil,這個字段用于實現(xiàn)類的繼承機制
  • cache 用于緩存最近調用的方法,方法緩存的是一個哈希表結構,他可以加速放的查找過程,避免每次方法調用都遍歷整個方法列表,方法緩存是根據(jù)使用頻率動態(tài)維護的
  • vtable 是一個可選的虛函數(shù)表,存儲了類的虛函數(shù)地址,
  • ro(read-only Data) ro是一個指向class_ro_t結構體的指針,class_ro_t結構體包含了與類相關的只讀數(shù)據(jù),例如類名嗎,方法列表,協(xié)議列表,屬性列表等。

3.類A ,有個分類,分類的方法和原有的的方法是怎么存儲的,如果多個分類有同一個方法,怎么判斷誰的優(yōu)先級更高?

每個類都有個方法列表,存儲在class_ro_t *ro里面,存儲了這個類的所有方法,包括實例方法和類方法,當你為某個類創(chuàng)建一個分類的時候并定義方法的時候,這些方法會被添加到該類的方法列表中,當分類被加載時,這個方法會被插入到類的方法列表中。
當多個分類定義了想通的方法名時,最后一個加載的分類方法實現(xiàn)會覆蓋之前的實現(xiàn)。
分類是按照他們被編譯和鏈接的順序一次加載的,最后加載的分類方法會覆蓋之前的同名方法,且優(yōu)先級最高。
由于加載順序的不可控,這種做法會導致方法的實現(xiàn)不可預測,最好創(chuàng)建分類時確保方法名的唯一性。

4,常用的線程鎖有哪些

  • NSLock 互斥鎖,防止多個線程同時訪問。
  • NSRecursiveLock ,遞歸鎖,允許同一線程多次獲取鎖而不會導致死鎖,適用于遞歸調用。
  • NSCondition,是一種鎖和條件變量相結合的對象,用于線程間得通信,可以用來等待或發(fā)送信號來控制線程的執(zhí)行。
  • NSConditionLock,是一種條件鎖,允許線程滿足某個條件時加鎖或者解鎖。
  • @synchronized oc 語法糖,方便的在塊級作用域內使用,可用于對象加鎖,確保只有一個線程在同一時間訪問代碼塊
  • dispatch_semaphore GCD 的信號量機制,
  • OSSPinklock,自旋鎖,用于某些情況下,存在優(yōu)先級反轉的問題,已經廢棄

5,block 有幾種,分別對應什么使用場景

  • 全局block (Global block)通常用于不依賴外部變量的回調或處理邏輯,比如常量的回調
void (^globalBlock)(void) = ^{
    NSLog(@"This is a global block.");
};
  • 棧block (Statck Block)
    當block 捕獲了外部自動變量,默認創(chuàng)建在棧中,隨著作用于的結束而銷毀。
    適用于當前作用域的的臨時操作,例如函數(shù)內部的邏輯處理
  • 堆block (Heap Block)
    當棧block 復制到堆中時,其生命周期,不在受作用域的限制,直到不再有引用時釋放,
    適用于長時間存活或者跨多個作用域使用的操作,比如異步操作中的回調,延遲執(zhí)行等

6.struct 和 class 的區(qū)別

  • 內存分配 和存儲
    st是值類型,通常存儲在棧上,賦值或者參數(shù)傳遞是是值傳遞
    class 是引用類型,通常存儲在堆上,賦值或者參數(shù)傳遞是地址的引用 ,通過引用計數(shù)進行管理
  • 繼承 和 多態(tài),
    st 不支持,不支持多態(tài)
    clas 支持,支持多態(tài),可以用父類的引用只想子類實例
  • 使用場景
    st適用于數(shù)據(jù)模型,表示輕量級的數(shù)據(jù)結構或者不需要繼承和復雜行為的模型,例如坐標顏色形狀等
    class 適用于復雜的對象,特別哪些需要共享 修改,后者繼承多態(tài)的場景

7,swift 的消息派發(fā)方式有哪些

消息的派發(fā)方式主要有三種:直接派發(fā)、表派發(fā) 和 消息派發(fā)。

  • 直接派發(fā)是最簡單、最快的派發(fā)方式。編譯器在編譯時就確定了要調用的方法,并在運行時直接調用這個方法,不需要任何額外的查找
    適用于 struct、enum 以及用 final 修飾的 class 或 class 方法。這些類型和方法在編譯時已經確定,且不會被重寫或繼承。
  • 表派發(fā)通過虛函數(shù)表(V-Table)來實現(xiàn)。當一個類有繼承關系時,編譯器會為其生成一個虛函數(shù)表,這個表記錄了類及其父類的所有方法的指針。在運行時,通過查找表來確定調用哪個方法。
    適用于沒有用 final 修飾的類(class)或方法(非 final 方法),這些方法可能會被子類重寫。
  • 消息派發(fā)主要存在于 Objective-C 的類(@objc 修飾的類或方法)中。它使用動態(tài)消息傳遞機制,即在運行時通過查找方法列表來確定要調用的方法。這種方式是 Objective-C 中的默認派發(fā)方式。
    適用于用 @objc 修飾的類或方法,以及所有繼承自 Objective-C 的類。這些方法可以在運行時被替換或攔截(比如通過 Method Swizzling)。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 近期整理的iOS面試題。不定期更新中。如有問題,歡迎斧正。 派發(fā) Swift 有三種派發(fā)方式 1靜態(tài)派發(fā) 2消息派...
    程序狗旭旭旭閱讀 1,953評論 0 5
  • 1.一個NSObject對象占用多少內存? 64bit: sizeof 也是以8字節(jié)對齊,是個運算符直接傳類型計算...
    流星閣閱讀 2,500評論 0 10
  • (答案不唯一,僅供參考,文章最后有福利) 一. iOS面試題---UI相關:事件傳遞,圖像顯示,性能優(yōu)化,離屏渲染...
    ios南方閱讀 3,005評論 0 11
  • iOS面試題 [toc] 一、設計基本原則 簡述六大設計基本原則(也稱 SOLID 五大原則) 單一職責原則 (S...
    JamieChen閱讀 807評論 0 6
  • 畢業(yè)好幾年了,上周發(fā)送了簡歷給騰訊,參加了騰訊面試。具體部門這邊就不說了。這次面試還是收獲到了很多。 一面電話面試...
    安東_Ace閱讀 6,698評論 8 44

友情鏈接更多精彩內容