當前位置:
首頁 > 最新 > 一份「有點難」的iOS面試題

一份「有點難」的iOS面試題

關鍵時刻,第一時間送達!

GIF

首先聲明,本文非原創,是看到MrPeak大大出的題目,內心滿懷忐忑的來回答一下.O(∩∩)O哈哈~ 其實好多題目我都不會,甚至有幾道題還藉助了百度,有幾個藉助了百度依舊不會~~~~(>

1.NSString如何計算字元的個數?

將一個NSString類型字元串獲取的長度轉換成類似ASCII編碼的長度,如漢字2個位元組,英文以及符號1個位元組這個功能。由於使用[NSString length]方法調用獲取的長度是一個中文和一個英文都是一個位元組,而使用

[NSString lengthOfBytesUsingEncoding:NSASCIIStringEncoding]方法無法識別中文編碼,真是令人揪心。於是想獲得一個char*類型的字元串,然後自己遍歷一遍,將它整理為類似ASCII編碼的格式,這裡要用到[NSString cStringUsingEncoding:NSUnicodeStringEncoding]函數獲得一個const char*指針,然後對這個字元串進行遍歷,遇/0就跳過,否則length+1,下面是代碼,拿出來與大家分享:

2.PKI體系當中加密和簽名有什麼區別?現在大家的很多重要活動都是通過網路進行的,那麼與之俱來的安全問題就顯得非常重要。同時很多安全保障機制都是基於PKI的, PKI指的是證明書的製作和分發的一種機制。在這個機制的保障前提下,進行可信賴的網路通信。即安全的網路通信保障機制。

PKI中使用雙證書、即雙密鑰,雙密鑰是指簽名密鑰對與加密密鑰對,從本質上說,兩個密鑰對都是非對稱密鑰對,因此,都可以用來作非對稱加解密.數字簽名和加密基本原理是什麼,具體我就不曉得了~~~~

3.如何自己高效實現NSUserDefault?

數據量一大讀取成本就高,敏感數據容易被破解,因為NSUserDefault實際上是明文存在 plist 中的,所以建議用戶安全相關的(如 token)盡量不要放在 UserDefault 中,即使要存也最好做一次加密再存,最好的方式是存在 Keychain 中。UserDefault 更適合存一些輕量的數據,如當前版本(可用來做檢測更新以及展示歡迎頁或其他邏輯)。建議使用 Sqlite 或其他數據存儲方式。

4.解釋下tcp的慢啟動特性。

餓......這個我還真不曉得,百度了也不知所以然,講的太深奧了,還希望知道的小夥伴用直白的話留言告知

5.如何用HTTP實現長連接?/ (HTTP能實現長連接嘛?)首先,http能實現長連接,是建立在tcp協議的基礎上的。但http中,其實沒有長連接這樣的類型。保持一個tcp連接是長連接。完全是通過程序員手動來控制的。如果程序員,想讓一個http連接,比如該連接叫A,讓A成為一個長連接。那麼,就不調用該連接的close()方法。直到,不再需要A連接的時候,才關閉該連接。那麼,A就叫做一個長連接HTTP連接分為兩種:

HTTP短連接(非持久連接)是指,客戶端和服務端進行一次HTTP請求/響應之後,就關閉連接。所以,下一次的HTTP請求/響應操作就需要重新建立連接。

HTTP長連接(持久連接)是指,客戶端和服務端建立一次連接之後,可以在這條連接上進行多次請求/響應操作。持久連接可以設置過期時間,也可以不設置。

HTTP短連接在首部欄位中設置Connection:close,則在一次請求/響應之後,就會關閉連接。

HTTP長連接

在首部欄位中設置Connection:keep-aliveKeep-Alive: timeout=60,表明連接建立之後,空閑時間超過60秒之後,就會失效。如果在空閑第58秒時,再次使用此連接,則連接仍然有效,使用完之後,重新計數,空閑60秒之後過期。設置HTTP長連接,無過期時間

在首部欄位中只設置Connection:keep-alive,表明連接永久有效。

實現原理:

了解怎麼設置之後,就開始用起來。然而,問題來了。在請求頭中設置Connection:keep-alive,為什麼連接空閑一段時間之後,還是斷開了呢?這是因為connection欄位只有服務端設置才有效。

HTTP操作是請求/響應成對出現的,即先有客戶端發出請求,後有服務端處理請求。所以,一次HTTP操作的終點操作在服務端上,關閉也是由服務端發起的。

6.HTTP2.0針對同一個域名的多個請求,會建立多少個tcp連接?記得之前面試一個大廠,面試官問我HTTP1.0,HTTP1.1,HTTP2.0的區別,我內心崩潰啊,並不曉得.此題目百度一番,見解如下:http2.0的前世是http1.0和http1.1這兩兄弟http誕生之初主要是應用於web端內容獲取,那時候內容還不像現在這樣豐富,排版也沒那麼精美,用戶交互的場景幾乎沒有。對於這種簡單的獲取網頁內容的場景,http表現得還算不錯。但隨著互聯網的發展和web2.0的誕生,更多的內容開始被展示(更多的圖片文件),排版變得更精美(更多的css),更複雜的交互也被引入(更多的js)。用戶打開一個網站首頁所載入的數據總量和請求的個數也在不斷增加。

http2.0要解決的一大難題就是多路復用(MultiPlexing),即連接共享。上面協議解析中提到的stream id就是用作連接共享機制的。

7.資料庫建表的時候索引有什麼用?資料庫索引是為了增加查詢速度而對錶欄位附加的一種標識.DB在執行一條Sql語句的時候,默認的方式是根據搜索條件進行全表掃描,遇到匹配條件的就加入搜索結果集合。如果我們對某一欄位增加索引,查詢時就會先去索引列表中一次定位到特定值的行數,大大減少遍歷匹配的行數,所以能明顯增加查詢的速度。

但是,對於記錄比較少的表,增加索引不會帶來速度的優化反而浪費了存儲空間,因為索引是需要存儲空間的,而且有個致命缺點是對於update/insert/delete的每次執行,欄位的索引都必須重新計算更新。

8.Full Text Search為什麼快?

全文檢索是對大數據文本進行索引,這個我不是太清楚,有些偏重後台了.

9.iOS下如何實現指定線程數目的線程池?

這個問題不曉得,百度了也不清楚~~~(>_~~~

10.介紹下iOS設備獲取唯一設備號的歷史變遷。iOS中獲取設備唯一標示符的方法一直隨版本的更新而變化但是,推薦大家用KeyChain來保存獲取到的UDID,因為APP刪了再裝回來,也可以從KeyChain中讀取回來,哈哈,公司的項目都是把UDID存在KeyChain。(SAMKeychain)

KeyChain.png

11.函數式編程當中的 first-class function是什麼意思呢?這道題目是百度的,我也是知其然不知其所以然....類型,定義了一個取值的集合,以及可作用的操作的集合。如C語言的int類型有一個上下界,可進行加減乘除等操作。變數可能有 int,float,string。。等類型,函數、對象等也有類型。

進一步,我們把類型分為三類:

First Class。該類型的值可以作為函數的參數和返回值,也可以賦給變數。

Second Class。該類型的值可以作為函數的參數,但不能從函數返回,也不能賦給變數。

Third Class。該類型的值作為函數參數也不行

多數程序語言中的整型、字元類型都是First Class的。在函數式語言(或支持函數式的語言)中,函數也是First Class的,或者說函數是「一等公民」。以函數為參數或返回值的函數稱為「高階函數」。

12.如何使用runtime hook一個class的某個方法,又如何hook某個instance的方法?首先要考慮 hook是否有公開頭文件的類方法一,hook已有公開頭文件的類,寫一個Utility函數.方法二,hook沒有公開頭文件的類,需要另建一個類作為新函數載體,然後先為被hook的類增加函數,再替換。

方法三,hook沒有公開頭文件的類,另建一個類作為新函數載體,用新函數替換舊函數,並把舊函數保存到靜態變數里.

13.談下Objective C都有哪些鎖機制,你一般用哪個?

iOS開發中常用的鎖有如下幾種:

@synchronized 同步鎖

NSLock 對象鎖

NSRecursiveLock 遞歸鎖

NSConditionLock 條件鎖

pthread_mutex 互斥鎖(C語言)

dispatch_semaphore 信號量實現加鎖(GCD)

OSSpinLock 參考YY

14.聊下HTTP post的body體使用form-urlencoded和multipart/form-data的區別。http與伺服器交互最常用的就是GET,POST兩個方法.1.application/x-www-form-urlencoded:這是標準且默認的編碼格式。當action為get時候,客戶端把form數據轉換成一個字串append到url後面,用?分割。當action為post時候,瀏覽器把form數據封裝到http body中,然後發送到server。2.multipart/form-data:

multipart表示的意思是單個消息頭包含多個消息體的解決方案。multipart媒體類型對發送非文本的各媒體類型是有用的。一般多用於文件上傳。

15.讓你設計一種機制檢測UIViewController的內存泄漏,你會怎麼做?

一般都是用Instrument來測試的.

16.通過[UIImage imageNamed:]生成的對象什麼時候被釋放?為了方便,一開始讀取圖像資源的時候都是直接使用了[UIImage imageNamed:@""]方法,這個方法非常方便,一句話就可以從bundle中讀取圖片。而[UIImage imageNamed:]只適合與UI界面中小的貼圖的讀取,而一些比較大的資源文件應該盡量避免使用這個介面。使用[UIImage imageWithContentsOfFile]替代.

類方法創建的會自動加入到自動釋放池中。

17.applicationWillEnterForeground和applicationDidBecomeActive都會在哪些場景下被調用?舉例越多越好。

當程序進入後台狀態時,名為applicationWillEnterForeground委託方法會被調用:-(void)applicationWillEnterForeground:(UIApplication *)application { }當程序復原時,applicationDidBecomeActive 委託方法會被調用

推送、支付、應用跳轉、分享、退到後台等.

18.如何終止正在運行的工作線程一般來講網路操作都是可以終止的,就 URLSession 來說,每個 task 都有 cancel 方法,直接 cancel 掉就好了。如果說是耗時的計算類線程,在恰當的地方加個 flag,cancel 時把 flag 置 false,線程就能及時終止。但是,GCD本身是沒有提供這樣的API的。終止一個線程中正在執行的任務:

設置一個標識符,假如是BOOL類型的,當它為NO的時候執行任務,當它變為YES的時候終止執行任務。

19.窮舉iOS下所有的本地持久化方案。所有的本地持久化數據存儲的本質都是寫文件,而且只能存到沙盒中。沙盒機制是蘋果的一項安全機制,本質就是系統給每個應用分配了一個文件夾來存儲數據,而且每個應用只能訪問分配給自己的那個文件夾,其他應用的文件夾是不能訪問的。

數據存儲的核心都是寫文件。主要有四種持久化方式:屬性列表,對象序列化,SQLite 資料庫, CoreData

20.如果公司強制996,你有什麼心裡話要對老闆說嗎?

沒什麼話,這個要看個人是否能夠接受.如果你也認同,那就好好工作.其實真正有效的解決方法並不是努力加班加點,而正好相反:工作更少的時間。更少的工作時間,更高的工作效率才是我們應該掌握的.疲勞的時候工作讓你產出值降低。你需要花越來越多的時間來解決問題,然後很快你就會發現你完全在浪費時間。持續長時間的工作會讓你難以集中注意,因為你很快就精疲力盡了。

MrPeak大大出的題目我是答了三波才答完的,真心感覺還是有一定難度的,同時自己也藉助百度惡補了一番,也讓我發現了自己的不足,以後還有多多瞻仰大神之作.

作者:翀鷹女孩

https://www.jianshu.com/p/66977486006e

程序員大咖整理髮布,轉載請聯繫作者獲得授權

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員大咖 的精彩文章:

TAG:程序員大咖 |