最新大廠iOS面試題——參考思路

邏輯教育-楚陽發表於2018-12-20

歡迎加入iOS高階交流群:624212887,大家互相交流學習

1、多執行緒的應用

2、GCD實現多個請求都完成之後返回結果

3、A、B兩個int陣列,得到A陣列中B陣列不包含的元素

4、事件傳遞鏈,頁面上一個按鈕,按鈕和它的superView有一樣的action,為什麼只執行button的action?

5、runtime的應用

6、array中加入物件,物件的retainCount會加1 如何是的物件自己管理自己的生命週期

7、bugly的卡頓監控原理

8、如何架構一個APP

9、c中,malloc物件,傳入了size,free只需要指標,這是為什麼?

10、如何管理移動端團隊,包括幫助大家提高技術

11、資料庫選擇原因(realm 、coreData、FMDB、Sqlite)

12、資料庫做過哪些優化

13、arc情況下,編譯的時候,系統是怎麼新增相關記憶體管理的程式碼

14、指令碼打包原理

15、app執行過程中,同時最多有幾個執行緒,怎麼實現的高併發

1、多執行緒的應用

一、共享資源

共享資源 : 就是記憶體中的一塊資源同時被多個程式所訪問,而每個程式可能會對該資源的資料進行修改

問題 : 如果 執行緒A 訪問了某塊資源 C,並且修改了其中的資料,此時 執行緒B 也訪問了 資源C,並且也對 C 中的資料進行了修改;那麼等到 執行緒A 和 執行緒B 執行結束後,此時,資源C 中的資料就並不是最初的設定了

二、執行緒通訊
通常, 一個執行緒不應該單獨存在,應該和其他執行緒之間有關係

例如 : 一個執行緒完成了自己的任務後需要切換到另一個執行緒完成某個任務;或者 一個執行緒將資料傳遞給另一個執行緒

三、執行緒的狀態

  • 當一個執行緒物件建立並開啟後,它就會被放到執行緒排程池中,等待系統排程;如圖


    最新大廠iOS面試題——參考思路
  • 當正在執行的執行緒被阻塞時,就會被移出 可排程執行緒池,此時不可再排程它


    最新大廠iOS面試題——參考思路
  • 當執行緒正常結束,異常退出,強制退出時都會導致該執行緒死亡,死亡的執行緒會從記憶體中移除,無法排程


    最新大廠iOS面試題——參考思路

2、GCD實現多個請求都完成之後返回結果

  • 同步堵塞
  • 柵欄函式
  • 排程組

3、A、B兩個int陣列,得到A陣列中B陣列不包含的元素

NSArray *arr1 = @[@1,@2,@3,@4,@5,@6,@7,@8];
NSArray *arr2 = @[@4,@5,@6,@7,@8,@9,@10,@11];
NSMutableArray *mArray = [NSMutableArray arrayWithCapacity:1];
for (int i=0; i<arr1.count; i++) {
    if (![arr2 containsObject:arr1[i]]) {
        [mArray addObject:arr1[i]];
    }
}
複製程式碼

4、事件傳遞鏈,頁面上一個按鈕,按鈕和它的superView有一樣的action,為什麼只執行button的action?

  • hitTest方法:首先會通過呼叫自身的 pointInside 方法判斷使用者觸控的點是否在當前物件的響應範圍內,如果 pointInside 方法返回 NO hitTest方法直接返回 nil
  • 如果 pointInside 方法返回 YES hitTest方法接著會判斷自身是否有子檢視.如果有則呼叫頂層子檢視的 hitTest 方法 直到有子檢視返回 View
  • 如果所有子檢視都返回 nil hitTest 方法返回自身.

5、runtime的應用

  • 具體應用攔截系統自帶的方法呼叫(Method Swizzling黑魔法)
  • 實現給分類增加屬性
  • 實現字典的模型和自動轉換
  • JSPatch替換已有的OC方法實行等
  • aspect 切面程式設計

6、array中加入物件,物件的retainCount會加1 如何是的物件自己管理自己的生命週期

[obj autoreleasepool] 將物件加到自動釋放池

7、bugly的卡頓監控原理

Runloop的兩次source的監控
渲染介面的頻率來監控幀率

8、如何架構一個app

架構app 方式方法有很多: MVC MVP MVVM 元件化 路由

9、c中,malloc物件,傳入了size,free只需要指標,這是為什麼?

總體上說,ptmalloc的記憶體管理是基於記憶體池的,而它的記憶體來源有兩種:
1 通過brk()獲得
2 通過mmap()匿名對映獲得

當使用者向ptmalloc請求記憶體時:
1 首先查詢定長記憶體分配池,如果查詢到則返回
2 如果沒有空閒記憶體可供使用,則向作業系統申請一塊64Mb的記憶體,從中切出使用者需要的記憶體,返回

當使用者呼叫free釋放記憶體時:
1 直接將記憶體放入適當的定長記憶體池佇列
2 如果觸發了一定的條件,則將所有空閒記憶體合併,如果滿足釋放條件,將記憶體全部還給作業系統

當然了,上面的描述中省略了太多的細節。比如什麼時候走brk什麼時候走mmap, 再比如當請求的記憶體大於一個闕值時,ptmalloc將會變成一個mmap的簡單封裝,還有觸發記憶體歸還作業系統的條件等等。
不過已經足夠回答題目中的問題了:因為malloc的時候記錄了大小。
這裡還可以得出另一個結論:由於malloc的時候記錄了大量的狀態,所以在頻繁使用malloc分配小記憶體時,會造成大量的記憶體浪費。舉例來說,當反覆malloc(1)時,每一次分配的記憶體在32位元組:包括size of previous chunk,size of chunk,bk_chunk_pointer,fd_chunk_pointer共4個指標,合計4 * 8 = 32位元組....

10、如何管理移動端團隊,包括幫助大家提高技術

這個題沒有固定答案,看你個人的經驗,團隊管理能力

11、資料庫選擇原因(realm 、coreData、FMDB、Sqlite)

SQLite
SQLite是在世界上使用的最多的資料庫引擎,並且還是開源的。它實現了無配置,無服務要求的事務資料庫引擎。SQLite可以在Mac OS-X, iOS, Android, Linux, 和 Windows上使用.
由於它是使用ANSI-C開發的,因此它提供了一個簡單的,方便使用的程式設計介面。SQLite也是一個小的,輕量級的,可以被儲存在跨平臺磁碟檔案的完善的資料庫。
SQLite之所以這麼流行的原因是:

  • 獨立於伺服器
  • 零配置
  • 多程式和執行緒下安全訪問。
  • 在表中使用含有特殊資料型別的一列或多列儲存資料。

Core Data
Core Data是App開發者可以使用的第二大主要的iOS儲存技術。你需要根據資料型別和資料量進行管理和儲存,SQLite和Core Data都有它們各自的優缺點。Core Data 更加關注於物件而不是傳統的表資料庫方法。使用Core Data,你可以儲存一個Objective-C類的物件。

  • 比SQLite使用更多的記憶體。
  • 比SQLite使用更多的儲存空間。
  • 比SQLite在取資料方面更快。

FMDB
FMDB框架其實只是一層很薄的封裝,主要的類也就兩個:FMDatabase和FMResultSet。在使用fmdb的時候還需要匯入libsqlite3.0.dylib。

core data允許使用者使用代表實體和實體間關係的高層物件來運算元據。它也可以管理序列化的資料,提供物件生存期管理與object_graph 管理,包括儲存。Core Data直接與Sqlite互動,避免開發者使用原本的SQL語句.

Realm
Realm 是個新技術。Realm天生比前面提到的資料庫解決方案更快,更高效。新的解決方案就叫做Realm,它是一個跨平臺的移動資料庫。它可以在Objective-C 和Swift中使用,並且它是專門為 iOS 和 Android設計的資料庫。
Realm最主要的優勢是:

  • 絕對免費
  • 快速,簡單的使用
  • 沒有使用限制
  • 為了速度和效能,執行在自己的持久化引擎上。

由於字數上限,以下面試題答案可加iOS高階交流群:624212887,獲取完整面試題

12、資料庫做過哪些優化

13、arc情況下,編譯的時候,系統是怎麼新增相關記憶體管理的程式碼

14、指令碼打包原理

15、app執行過程中,同時最多有幾個執行緒,怎麼實現的高併發

結語

以上問題加參考答案,部分自己回答(好友回答)+網上部落格參考,希望對讀者有所幫助,回答的不好勿噴!


相關文章