回復「01」歡迎[加入](正在跳轉)iOS高級交流平臺,大家互相交流學習

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

二、線程通信

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

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

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

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

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

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最主要的優勢是:
  • 絕對免費
  • 快速,簡單的使用
  • 沒有使用限制
  • 為了速度和性能,運行在自己的持久化引擎上。

由於字數上限,以下面試題答案可回復「01」歡迎[加入](正在跳轉)iOS高級交流平臺,獲取完整面試題,大家也可互相交流,一起進步

12、資料庫做過哪些優化 13、arc情況下,編譯的時候,系統是怎麼添加相關內存管理的代碼 14、腳本打包原理 15、app運行過程中,同時最多有幾個線程,怎麼實現的高並發

結語

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