iOS 面試總結

在這個公司待了三年,雖然我有足夠的危機感,可是並無讓我提高多少,因此我迫切的想換個工做環境,因而去了幾個公司面試,有個自稱是用戶在三億左右的公司,且不說用戶量是真是假。問了不少混合開發的東西,弱項,可想而知有多狼狽了吧。綜合幾家公司的面試,寫了這篇文集,有問題能夠留言。謝謝。php

  1. 開發框架的選擇:原生開發?混合開發?

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 解決。

  1. jsbridge 橋接h5

基本就是依賴於 WKWebView,實現其代理,使用js 與OC的交互就能完成

5.音視頻開發這塊,音視頻播放的原理是什麼?

視音頻技術主要是:音頻技術,主要包括音視頻的壓縮編碼技術,若是考慮到網絡傳輸的話還要考慮到流媒體協議技術。

播放網上的視頻文件,須要通過如下幾個步驟:解協議,解封裝,解碼音視頻,音視頻同步;若是是解碼本地文件則不須要解協議。

解協議:由於播放視頻的時候須要遵循各類流媒體協議技術(http,RTMP,MMS等),須要解析爲標準的相應的封裝格式數據。能夠簡單的理解爲不一樣廠家對應不一樣的音視頻格式。

解封裝:就是將輸入的封裝格式(MP3,MP4,FLv等)的數據,分離爲音頻流壓縮編碼數據或者視頻流壓縮編碼數據。

解碼:能夠簡單理解爲就是對數據視頻進行壓縮/解壓縮的過程。常見的有H.26X(H.264,H.265等),MPEG等。

音視頻同步:就是將解碼好的是音視頻經過聲卡/顯卡 播放出來。

  1. weak 與assign 的區別?代理是什麼修飾?

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實現。

  1. 成員變量與實例變量的區別是什麼?屬性是什麼?

  2. 可變數組你常用什麼修飾,可否使用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 代碼代替混編。

  1. GCD原理

你們都知道蘋果的大部分東西都是不開源的,網上有大牛寫了個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表中刪除,最後清理對象的記錄。


原文:blog.csdn.net/qq_33726122…

本文源自第三方轉載。

相關文章
相關標籤/搜索