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

歡迎加入iOS高級交流羣:624212887,你們互相交流學習

一、多線程的應用面試

二、GCD實現多個請求都完成以後返回結果sql

三、A、B兩個int數組,獲得A數組中B數組不包含的元素數據庫

四、事件傳遞鏈,頁面上一個按鈕,按鈕和它的superView有同樣的action,爲何只執行button的action?編程

五、runtime的應用數組

六、array中加入對象,對象的retainCount會加1 如何是的對象本身管理本身的生命週期安全

七、bugly的卡頓監控原理服務器

八、如何架構一個APP多線程

九、c中,malloc對象,傳入了size,free只須要指針,這是爲何?架構

十、如何管理移動端團隊,包括幫助你們提升技術併發

十一、數據庫選擇緣由(realm 、coreData、FMDB、Sqlite)

十二、數據庫作過哪些優化

1三、arc狀況下,編譯的時候,系統是怎麼添加相關內存管理的代碼

1四、腳本打包原理

1五、app運行過程當中,同時最多有幾個線程,怎麼實現的高併發

一、多線程的應用

1、共享資源

共享資源 : 就是內存中的一塊資源同時被多個進程所訪問,而每一個進程可能會對該資源的數據進行修改

問題 : 若是 線程A 訪問了某塊資源 C,而且修改了其中的數據,此時 線程B 也訪問了 資源C,而且也對 C 中的數據進行了修改;那麼等到 線程A 和 線程B 執行結束後,此時,資源C 中的數據就並非最初的設置了

2、線程通訊

一般, 一個線程不該該單獨存在,應該和其餘線程之間有關係

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

3、線程的狀態

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

13277235-91cc631d26f59f69.png

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

13277235-ac8930c9d32be2e5.png

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

13277235-51b18bd7abded869.png

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

  • 同步堵塞
  • 柵欄函數
  • 調度組

三、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]];
    }
}

四、事件傳遞鏈,頁面上一個按鈕,按鈕和它的superView有同樣的action,爲何只執行button的action?

  • hitTest方法:首先會經過調用自身的 pointInside 方法判斷用戶觸摸的點是否在當前對象的響應範圍內,若是 pointInside 方法返回 NO hitTest方法直接返回 nil
  • 若是 pointInside 方法返回 YES hitTest方法接着會判斷自身是否有子視圖.若是有則調用頂層子視圖的 hitTest 方法 直到有子視圖返回 View
  • 若是全部子視圖都返回 nil hitTest 方法返回自身.

五、runtime的應用

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

六、array中加入對象,對象的retainCount會加1 如何是的對象本身管理本身的生命週期

[obj autoreleasepool] 將對象加到自動釋放池

七、bugly的卡頓監控原理

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

八、如何架構一個app

架構app 方式方法有不少: MVC MVP MVVM 組件化 路由

九、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字節....

十、如何管理移動端團隊,包括幫助你們提升技術

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

十一、數據庫選擇緣由(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,獲取完整面試題

十二、數據庫作過哪些優化

1三、arc狀況下,編譯的時候,系統是怎麼添加相關內存管理的代碼

1四、腳本打包原理

1五、app運行過程當中,同時最多有幾個線程,怎麼實現的高併發

結語

以上問題加參考答案,部分本身回答(羣友回答)+網上博客參考,但願對讀者有所幫助,回答的很差勿噴!

相關文章
相關標籤/搜索