歡迎加入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 中的數據就並不是最初的設置了
二、線程通信
通常, 一個線程不應該單獨存在,應該和其他線程之間有關係
例如 : 一個線程完成了自己的任務後需要切換到另一個線程完成某個任務;或者 一個線程將數據傳遞給另一個線程
三、線程的狀態
- 當一個線程對象創建並開啓後,它就會被放到線程調度池中,等待系統調度;如圖
當正在運行的線程被阻塞時,就會被移出 可調度線程池,此時不可再調度它
- 當線程正常結束,異常退出,強制退出時都會導致該線程死亡,死亡的線程會從內存中移除,無法調度
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運行過程中,同時最多有幾個線程,怎麼實現的高併發
結語
以上問題加參考答案,部分自己回答(羣友回答)+網上博客參考,希望對讀者有所幫助,回答的不好勿噴!