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

歡迎加入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 中的數據就並不是最初的設置了

二、線程通信

通常, 一個線程不應該單獨存在,應該和其他線程之間有關係

例如 : 一個線程完成了自己的任務後需要切換到另一個線程完成某個任務;或者 一個線程將數據傳遞給另一個線程

三、線程的狀態

  • 當一個線程對象創建並開啓後,它就會被放到線程調度池中,等待系統調度;如圖

13277235-91cc631d26f59f69.png

當正在運行的線程被阻塞時,就會被移出 可調度線程池,此時不可再調度它

13277235-ac8930c9d32be2e5.png

  • 當線程正常結束,異常退出,強制退出時都會導致該線程死亡,死亡的線程會從內存中移除,無法調度

13277235-51b18bd7abded869.png

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運行過程中,同時最多有幾個線程,怎麼實現的高併發

結語

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章