在這個公司待了三年,雖然我有足夠的危機感,可是並無讓我提高多少,因此我迫切的想換個工做環境,因而去了幾個公司面試,有個自稱是用戶在三億左右的公司,且不說用戶量是真是假。問了不少混合開發的東西,弱項,可想而知有多狼狽了吧。綜合幾家公司的面試,寫了這篇文集,有問題能夠留言。謝謝。php
1.1原生開發:在應用的性能上以及用戶體驗上是最好的,可是原生的可移植性較差,因此相對來講開發成本會稍微高點。git
1.2H5與原生混合開發,主要的就用利用WKWebView,實現原生與H5的混合,主要利用的就是JS作一些交互(JSBridge的橋接)。若是頁面須要變化量很快 或者是活動啥的,建議混合開發,能夠節約成本(IOS+Android 共用一個h5界面),部署更新,升級都比較快。可是用戶體驗及性能上就稍微差些,並且有的也比較消耗資源。可是企業級的app 由於須要使用基礎組件,如推送通知,管理,安全,分析數據同步和鏈接到企業的數據庫,訂閱等等,不一樣的場景下要視狀況而定。github
1.3其餘的能夠學習下RN,Flutter,我也打算學習fluter面試
2.如何保證app的穩定性?數據庫
2.1 app穩定性首先考慮代碼的邏輯,設計模式的選擇等等。編程
內存問題:體如今內存泄露,內存警告方面。開發中學會使用instrument 檢測內存泄露,cpu使用率(Instruments的time profile來定位並解決問題)以及啓動時間(能夠參考個人關於啓動優化的文章)等指標,循環引用等問題。循環引用容易引發內存泄露,內存激增,進而致使Crash。常見的有Delegate,Block,NStimerswift
2.2 單元測試設計模式
可藉助Xcode自帶的單元測試,也可以使用第三方框架OCMock數組
2.3.Crash 的監控瀏覽器
3.開發中如何解決耦合性?
3.1建議看下MVVM+RAC開發
3.2目前最多見的有router 這個解決方案。viewmodel 吧展現層的數據 view /model 的業務處理隔離開。中間層的業務邏輯耦合性就很高,能夠經過router 解決。
基本就是依賴於 WKWebView,實現其代理,使用js 與OC的交互就能完成
5.音視頻開發這塊,音視頻播放的原理是什麼?
視音頻技術主要是:音頻技術,主要包括音視頻的壓縮編碼技術,若是考慮到網絡傳輸的話還要考慮到流媒體協議技術。
播放網上的視頻文件,須要通過如下幾個步驟:解協議,解封裝,解碼音視頻,音視頻同步;若是是解碼本地文件則不須要解協議。
解協議:由於播放視頻的時候須要遵循各類流媒體協議技術(http,RTMP,MMS等),須要解析爲標準的相應的封裝格式數據。能夠簡單的理解爲不一樣廠家對應不一樣的音視頻格式。
解封裝:就是將輸入的封裝格式(MP3,MP4,FLv等)的數據,分離爲音頻流壓縮編碼數據或者視頻流壓縮編碼數據。
解碼:能夠簡單理解爲就是對數據視頻進行壓縮/解壓縮的過程。常見的有H.26X(H.264,H.265等),MPEG等。
音視頻同步:就是將解碼好的是音視頻經過聲卡/顯卡 播放出來。
6.1.在ARC,weak 只能修飾對象,若是修飾基礎數據類型,編譯器會報錯。在MRC時尚未weak 這個修飾符
6.2 assign 能夠修飾對象也能夠修飾基本數據類型,assign 修飾對象時會致使致使野指針問題,由於被assign修飾的對象在對象釋放後,指針不會被置爲nil,因此在次向對象發消息就會崩潰。可是被weak 修飾的對象則不會出現野指針的問題,當weak修飾的對象被系統回收時指針會被置爲nil。再次向其發消息,不會崩潰。
6.3 經過以上咱們知道代理爲何常用weak修飾,一是爲了解決循環引用問題,二是爲了防止野指針的出現。
7.分類可否添加屬性?可否添加成員變量?爲何?
7.1在{ } 內直接聲明 成員變量,編譯器會直接報錯。因此分類不能直接添加成員變量。
7.2分類是能夠聲明屬性的,能夠經過clang 編譯器查看他的底層結構
struct _category_t {
const char *name;
struct _class_t *cls;
const struct _method_list_t *instance_methods;
const struct _method_list_t *class_methods;
const struct _protocol_list_t *protocols;
const struct _prop_list_t *properties;
};
可是他只能生成set/get的聲明,不能生成 set/get 方法的實現 ,因此在外部引用的時候,運行會報錯。經典錯誤unrecognized selector sent to instance
可使用runtime的動態添加關聯對象 objc_setAssociatedObject(obj, &MyKey, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC) objc_getAssociatedObject實現。
成員變量與實例變量的區別是什麼?屬性是什麼?
可變數組你常用什麼修飾,可否使用copy?
可變數組使用strong修飾,不可變數組使用copy修飾
可變數組若是使用copy修飾的話,而後使其變成不可變數組,若是對數組進入增刪改操做,而後發現carsh
這裏涉及到 深/淺拷貝,深拷貝copy 拷貝其內存地址,淺拷貝strong 拷貝對象。
10.block 使用什麼關鍵字修飾,爲何?block 想再其內部修改外部變量,須要怎麼作,緣由是什麼?
10.1在MRC 下建議使用copy 修飾block,在ARC下建議使用copy/strong 修飾block
在MRC下block 的內存地址是在棧區,棧區的對象隨時都會被系統回收,因此須要使用copy把它複製到堆區。
在ARC下,使用copy/strong 修飾block時,系統會對block 自動進行一個拷貝到堆區。
10.2 在ARC 下__block修飾外部變量,會將其包裝成一個forwarding 指針指向本身。經過forwarding 修改內部變量的值。
11,OC Swift 混合開發,包的體積大嗎?如何瘦身?
11.1 OC與Swift 混編會讓你的ipa包體積增大,好比OC項目用到Swift的第三方,pod導入到工程時,會把Swift的整個庫包也導入進來,致使項目至少會增長20兆左右。好在上傳到appstore ,商城會進行必定的瘦身。
11.2 如何瘦身? 使用純OC 代碼代替混編。
你們都知道蘋果的大部分東西都是不開源的,網上有大牛寫了個GCD的源碼,供參考,奉獻上連接以下:github.com/apple/swift…
另外GNUstep 是GNU計劃之一,他們將Cocoa 的OC庫從新寫了一遍,雖然不是蘋果正兒八經的源碼可是能夠做爲參考,如下連接是:www.gnustep.org/resources/d…
// 代碼片斷摘自libdispatch
//typedef void (^dispatch_block_t)(void);
void
dispatch_async(dispatch_queue_t dq, dispatch_block_t work)
{
/*_dispatch_continuation_alloc 的實現
static inline dispatch_continuation_t
_dispatch_continuation_alloc(void)
{
dispatch_continuation_t dc =
_dispatch_continuation_alloc_cacheonly();
if (unlikely(!dc)) {
return _dispatch_continuation_alloc_from_heap();
}
return dc;
}
從(線程的私有存儲,線程都是有本身的私有存儲的,這些私有存儲不會被其餘線程所使用)中提取出一個 dispatch_continuation_t 結構
*/
dispatch_continuation_t dc = _dispatch_continuation_alloc();
uintptr_t dc_flags = DISPATCH_OBJ_CONSUME_BIT;
_dispatch_continuation_init(dc, dq, work, 0, 0, dc_flags);
_dispatch_continuation_async(dq, dc);
}
以上我只寫了GCD的dispatch_async 異步執行的入口,你們能夠下載看看源碼
總結:dispatch_async用鏈表保存全部提交的 block,而後在底層線程池(p_thread 建立)中,依次取出 block 並執行;
dispatch_sync同步方法的實現相對來講更簡單,只須要將任務壓入響應的隊列,並用信號量作等待;
13.http 與 https的區別?sotocket 通信的實現原理以及其返回response的數據格式?
http:網絡上使用最普遍的一種協議,是一個客戶端與服務器端請求和應答的標準。用於向www服務器傳輸超文本到本地瀏覽器的一個傳輸協議。以明文傳輸,不安全。
https:簡單的來講是http的安全版。在http的基礎上嵌入了SSL協議。SSL是依靠證書來驗證服務器的身份,併爲瀏覽器與服務器之間的通信進行加密。
加密解密等等三次握手自行腦補吧
socket: Socket是應用層與TCP/IP協議族通訊的中間軟件抽象層,它是一組接口,能夠理解爲是編程接口,是對tcp/ip的封裝。網絡上的兩個程序之間想要實現數據的雙向傳輸交換(網絡上的兩個程序經過一個雙向的通訊鏈接實現數據的交換,這個鏈接的一端稱爲一個socket)。
socket:開->讀,寫->關閉。socket便是一種特殊的文件。 網絡層的「ip地址」能夠惟一標識網絡中的主機,而傳輸層的「協議+端口」能夠惟一標識主機中的應用程序(進程)。這樣利用三元組(ip地址,協議,端口)就能夠標識網絡的進程了,網絡中的進程通訊就能夠利用這個標誌與其它進程進行交互。
14.weak的實現原理?
weak 自己是個hash 表。key 是所指對象的地址,Value是weak 指針的地址數組(一個對象可能被多個弱指針指向)。runtime維護了一個weak表,用於存儲一個對象的全部的weak指針。
一、初始化時:runtime會調用objc_initWeak函數,初始化一個新的weak指針指向對象的地址。
二、添加引用時:objc_initWeak函數會調用 objc_storeWeak() 函數, objc_storeWeak() 的做用是更新指針指向,建立對應的弱引用表。
三、釋放時,調用clearDeallocating函數 首先根據對象地址獲取全部weak指針地址的數組,而後遍歷這個數組把其中的數據設爲nil,最後把這個entry從weak表中刪除,最後清理對象的記錄。
本文源自第三方轉載。