iOS之2016面試題一(轉)

序言

招聘高峯期來了,你們都很是積極地準備着跳槽,那麼去一家公司 面試就會有一堆新鮮的問題,可能不會,也可能會,可是瞭解不夠深。本篇文章爲羣裏的小夥伴們去寶庫公司的筆試題,由筆者整理並提供筆者我的參考答案。注意,僅供參考,不表明絕對正確。

參考答案不惟一,你們能夠根據本身的理解回答,沒有必要跟筆者的同樣。參考筆者的答案,也許給你帶來靈感!html

一、對數組中的元素去重複

例如:ios

參考答案:web

  • 第一種方法:開闢新的內存空間,而後判斷是否存在,若不存在則添加到數組中,獲得最終結果的順序不發生變化。效率分析:時間複雜度爲O ( n2 ):

補充:原來集合操做能夠經過valueForKeyPath來實現的,去重能夠一行代碼實現:面試

可是返回的結果是無序的,與原來的順序不一樣。你們能夠閱讀:Collection Operators算法

  • 第二種方法:利用NSDictionary去重,字典在設置key-value時,若已存在則更新值,若不存在則插入值,而後獲取allValues。若不要求有序,則能夠採用此種方法。若要求有序,還得進行排序。效率分析:只須要一個循環就能夠完成放入字典,若不要求有序,時間複雜度爲O(n)。若要求排序,則效率與排序算法有關:

若是須要按照原來的升序排序,能夠這樣:數據庫

  • 第三種方法:利用集合NSSet的特性(肯定性、無序性、互異性),放入集合就自動去重了。可是它與字典擁有一樣的無序性,所得結果順序再也不與原來同樣。若是不要求有序,使用此方法與字典的效率應該是差很少的。效率分析:時間複雜度爲O (n):

若是要求有序,那就得排序,好比這裏要升序排序:swift

補充:數組

一直沒有使用過有序集合,網友們反饋到能夠直接使用有序集合,感謝你們:緩存

以上三種方法是筆者所能想到的辦法。若是你們有更好的辦法,歡迎在評論中指出。服務器

二、說說如下元素的特性和做用

參考答案:

特性:

  • NSArray表示不可變數組,是有序元素集,只能存儲對象類型,可經過索引直接訪問元素,並且元素類型能夠不同,可是不能進行增、刪、改操做;NSMutableArray是可變數組,能進行增、刪、改操做。經過索引查詢值很快,可是插入、刪除等效率很低。
  • NSSet表示不可變集合,具備肯定性、互異性、無序性的特色,只能訪問而不能修改集合;NSMutableSet表示可變集合,能夠對集合進行增、刪、改操做。集合經過值查詢很快,插入、刪除操做極快。
  • NSDictionary表示不可變字典,具備無序性的特色,每一個key對應的值是惟一的,可經過key直接獲取值;NSMutableDictionary表示可變字典,能對字典進行增、刪、改操做。經過key查詢值、插入、刪除值都很快。

做用:

  • 數組用於處理一組有序的數據集,好比經常使用的列表的dataSource要求有序,可經過索引直接訪問,效率高。
  • 集合要求具備肯定性、互異性、無序性,在iOS開發中是比較少使用到的,筆者也不清楚如何說明其做用
  • 字典是鍵值對數據集,操做字典效率極高,時間複雜度爲常量,可是值是無序的。在ios中,常見的JSON轉字典,字典轉模型就是其中一種應用。

三、簡單描述一下XIB與Storyboards,說一下他們的優缺點。

參考答案:

筆者傾向於純代碼開發,因此所提供的參考答案可能具備必定的我的感情,不過仍是給你們說說筆者的想法。

優勢:

  • XIB:在編譯前就提供了可視化界面,能夠直接拖控件,也能夠直接給控件添加約束,更直觀一些,並且類文件中就少了建立控件的代碼,確實簡化很多,一般每一個XIB對應一個類。
  • Storyboard:在編譯前提供了可視化界面,可拖控件,可加約束,在開發時比較直觀,並且一個storyboard能夠有不少的界面,每一個界面對應一個類文件,經過storybard,能夠直觀地看出整個App的結構。

缺點:

  • XIB:需求變更時,須要修改XIB很大,有時候甚至須要從新添加約束,致使開發週期變長。XIB載入相比純代碼天然要慢一些。對於比較複雜邏輯控制不一樣狀態下顯示不一樣內容時,使用XIB是比較困難的。當多人團隊或者多團隊開發時,若是XIB文件被髮動,極易致使衝突,並且解決衝突相對要困難不少。
  • Storyboard:需求變更時,須要修改storyboard上對應的界面的約束,與XIB同樣可能要從新添加約束,或者添加約束會形成大量的衝突,尤爲是多團隊開發。對於複雜邏輯控制不一樣顯示內容時,比較困難。當多人團隊或者多團隊開發時,你們會同時修改一個storyboard,致使大量衝突,解決起來至關困難。

四、請把字符串2015-04-10格式化日期轉爲NSDate類型

參考答案:

五、在App中混合HTML5開發App如何實現的。在App中使用HTML5的優缺點是什麼?

參考答案:

在iOS中,一般是一般UIWebView來實現,固然在iOS8之後可使用WKWebView來實現.有如下幾種實現方法:

  • 經過實現UIWebView的代理方法來攔截,判斷scheme是不是約定好的,而後iOS調用本地相關API來實現:

優缺點:

  • iOS加入H5響應比原生要慢不少,體驗不太好,這是缺點。
  • iOS加入H5能夠實現嵌入別的功能入口,可隨時更改,不用更新版本就能夠上線,這是最大的優勢

六、請描述一下同步和異步,說說它們之間的區別。

參考答案:

首先,咱們要明確一點,同步和異步都是在線程中使用的。在iOS開發中,好比網絡請求數據時,若使用同步請求,則只有請求成功或者請求失敗獲得響應返回後,才能繼續往下走,也就是才能訪問其它資源(會阻塞了線程)。網絡請求數據異步請求時,不會阻塞線程,在調用請求後,能夠繼續往下執行,而不用等請求有結果才能繼續。

區別:

  • 線程同步:是多個線程訪問同一資源時,只有當前正在訪問的線程訪問結束以後,其餘線程才能開始訪問(被阻塞)。
  • 線程異步:是多個線程在訪問競爭資源時,能夠在空閒等待時去訪問其它資源(不被阻塞)。

七、請簡單描述一下隊列和多線程的使用原理。

 

參考答案:

在iOS中隊列分爲如下幾種:

  • 串行隊列:隊列中的任務只會順序執行
  • 並行隊列: 隊列中的任務一般會併發執行
  • 全局隊列:是系統的,直接拿過來(GET)用就能夠;與並行隊列相似
  • 主隊列:每個應用程序對應惟一一個主隊列,直接GET便可;在多線程開發中,使用主隊列更新UI

上面這四種是針對GCD來說的,串行隊列中的任務只能一個個地執行,在前一個沒有執行完畢以前,下一個只能等待。並行隊列能夠併發地執行任務,所以多個任務之間執行的順序不能肯定,當添加一個新的任務時,交由GCD來判斷是否要建立新的新的線程。

你們能夠閱讀圖片多線程,也許更明瞭:

八、描述一下iOS的內存管理,在開發中對於內存的使用和優化包含哪些方面。咱們在開發中應該注意哪些問題。

參考答案:

內存管理準則:誰強引用過,誰就在再也不使用時使引用計數減一。

對於內存的使用和優化常見的有如下方面:

  • 重用問題:如UITableViewCells、UICollectionViewCells、UITableViewHeaderFooterViews設置正確的reuseIdentifier,充分重用。
  • 儘可能把views設置爲不透明:當opque爲NO的時候,圖層的半透明取決於圖片和其自己合成的圖層爲結果,可提升性能。
  • 不要使用太複雜的XIB/Storyboard:載入時就會將XIB/storyboard須要的全部資源,包括圖片所有載入內存,即便將來好久纔會使用。那些相比純代碼寫的延遲加載,性能及內存就差了不少。
  • 選擇正確的數據結構:學會選擇對業務場景最合適的數組結構是寫出高效代碼的基礎。好比,數組: 有序的一組值。使用索引來查詢很快,使用值查詢很慢,插入/刪除很慢。字典: 存儲鍵值對,用鍵來查找比較快。集合: 無序的一組值,用值來查找很快,插入/刪除很快。
  • gzip/zip壓縮:當從服務端下載相關附件時,能夠經過gzip/zip壓縮後再下載,使得內存更小,下載速度也更快。
  • 延遲加載:對於不該該使用的數據,使用延遲加載方式。對於不須要立刻顯示的視圖,使用延遲加載方式。好比,網絡請求失敗時顯示的提示界面,可能一直都不會使用到,所以應該使用延遲加載。
  • 數據緩存:對於cell的行高要緩存起來,使得reload數據時,效率也極高。而對於那些網絡數據,不須要每次都請求的,應該緩存起來,能夠寫入數據庫,也能夠經過plist文件存儲。
  • 處理內存警告:通常在基類統一處理內存警告,將相關不用資源當即釋放掉
  • 重用大開銷對象:一些objects的初始化很慢,好比NSDateFormatter和NSCalendar,但又不可避免地須要使用它們。一般是做爲屬性存儲起來,防止反覆建立。
  • 避免反覆處理數據:許多應用須要從服務器加載功能所需的常爲JSON或者XML格式的數據。在服務器端和客戶端使用相同的數據結構很重要。
  • 使用Autorelease Pool:在某些循環建立臨時變量處理數據時,自動釋放池以保證能及時釋放內存。
  • 正確選擇圖片加載方式:詳情閱讀細讀UIImage加載方式

九、plist文件是用來作什麼的。通常用它來處理一些什麼方面的問題。

參考答案:

plist是iOS系統中特有的文件格式。咱們經常使用的NSUserDefaults偏好設置實質上就是plist文件操做。plist文件是用來持久化存儲數據的。

咱們一般使用它來存儲偏好設置,以及那些少許的、數組結構比較複雜的不適合存儲 數據庫的數據。好比,咱們要存儲全國城市名稱和id,那麼咱們要優先選擇plist直接持久化存儲,由於更簡單。

十、iOS中緩存必定量的數據以便下次能夠快速執行,那麼數據會存儲在什麼地方,有多少種存儲方式?

參考答案:

  • 偏好設置(NSUserDefaults)
  • plist文件存儲
  • 歸檔
  • SQLite3
  • Core Data

詳情請閱讀:iOS經常使用的持久化存儲方式

十一、請簡單寫出增、刪、改、查的SQL語句。

參考答案:

數據庫的簡單操做,仍是會的,大學可沒白學。

增:

刪:

改:

查:

十二、在提交蘋果審覈時,遇到哪些問題被拒絕,對於被拒絕的問題是如何處理的。

參考答案:

對於筆者而言,所提交過的app尚未被拒絕過。不過在筆者所維護的幾個羣裏常常有朋友們問到相關被拒絕的解決辦法。幸虧還懂一點點英文,還能幫助他們翻譯翻譯蘋果反饋的被拒緣由及所擔的建議。

這裏只列出幾種最多見的被拒緣由:

  • 最多見到的就是app中有虛擬物品交易,可是不是走內購致使被拒。
  • 音頻類App或者使用到音頻相關的app,由於版權問題而被拒
  • App出現必閃退而被拒

最後

在這個夜晚,全部答案都是筆者花了大量的時間來整理出來的,且看且珍惜吧!

相關文章
相關標籤/搜索