課堂模擬面試試題

1、列舉一下 Cocoa/Cocoa Touch 中常見的幾種多線程方案的實現(xiàn),并談?wù)劧嗑€程安全的幾種解決辦法以及多線程安全怎么控制?多線程

A:

方案

| 方案 | 語言 | 線程生命周期</br>是否需要手動管理 | 簡介 |
| :-: | :-: | :-: | :-: |
| pthread | C | 需要 | 通用的API</br>跨平臺/可移植 </br>使用難度大 |
| NSThread | OC | 需要 | 面向?qū)ο?lt;/br>可直接操作線程對象 |
| GCD | C | 不需要 | 充分利用CPU的多個核心</br>旨在代替NSThread |
| NSOperation | OC | 不需要 | 基于GCD </br>更加面向?qū)ο?</br>Apple 推薦使用|

線程安全

1> 只在主線程刷新訪問UI
2> 如果要防止資源搶奪,得用synchronized進(jìn)行加鎖保護(hù)
3> 如果異步操作要保證線程安全等問題, 盡量使用GCD(因為GCD中有些函數(shù)默認(rèn)就是安全的)

2、什么情況下會發(fā)生內(nèi)存泄漏和內(nèi)存溢出?內(nèi)存管理

A:

當(dāng)程序在申請內(nèi)存后,沒有釋放已申請的內(nèi)存空間(例如一個對象或者變量使用完成后沒有釋放,這個對象一直占用著內(nèi)存),一次內(nèi)存泄露危害可以忽略,但內(nèi)存泄露堆積后果很嚴(yán)重,無論多少內(nèi)存,遲早會被占光.內(nèi)存泄露會最終會導(dǎo)致內(nèi)存溢出,導(dǎo)致程序崩潰,嚴(yán)重的可能無法上架 App Store.
當(dāng)程序在申請內(nèi)存時,沒有足夠的內(nèi)存空間供其使用,出現(xiàn)out of memory;比如申請了一個int,但給它存了long才能存下的數(shù),那就是內(nèi)存溢出.

3、我們說的 Objective-C 是動態(tài)運行時語言,你是怎么理解這句話的?Foundation框架

A:

主要是將數(shù)據(jù)類型的確定由編譯時,推遲到了運行時.
這個問題其實淺涉及到兩個概念,運行時多態(tài).

簡單來說:
運行時機(jī)制使我們直到運行時才去決定一個對象的類別,以及調(diào)用該類別對象指定方法.
不同對象以自己的方式響應(yīng)相同的消息,這個能力叫做多態(tài).
意思就是假設(shè)動物類(Animal)都擁有一個相同的對象方法 - eat; 那人類(Person)是屬于動物的,狗(Dog)也屬于動物,當(dāng)他們都繼承了 Animal 這個類后,各自實現(xiàn)各自的 - eat,但是調(diào)用時我們只需調(diào)用各自的 - eat 方法.也就是不同的對象以自己的方式響應(yīng)了相同的消息.因此也可以說,運行時機(jī)制是多態(tài)的基礎(chǔ).

4、簡單說一下 App的啟動過程,(從 main 文件開始說起)Application

A:

程序啟動分為兩類:

1.有storyboard
2.沒有storyboard

1.main函數(shù)
2.UIApplicationMain

  • 創(chuàng)建UIApplication對象
  • 創(chuàng)建UIApplication的delegate對象

3.根據(jù)Info.plist獲得最主要storyboard的文件名,加載最主要的storyboard有storyboard

  • 創(chuàng)建UIWindow
  • 創(chuàng)建和設(shè)置UIWindow的rootViewController
  • 顯示窗口

3.delegate對象開始處理(監(jiān)聽)系統(tǒng)事件沒有storyboard

  • 程序啟動完畢的時候, 就會調(diào)用代理的
    application:didFinishLaunchingWithOptions:方法
  • application:didFinishLaunchingWithOptions:中創(chuàng)建UIWindow
  • 創(chuàng)建和設(shè)置UIWindow的rootViewController
  • 顯示窗口(方法makeKeyAndVisable)

程序正常退出時,UIApplicationMain函數(shù)才會返回.

5、UIView 和 CALayer 之間的關(guān)系?

A:

UIView顯示在屏幕上歸功于CALayer,通過調(diào)用drawRect方法來渲染自身的內(nèi)容,調(diào)節(jié)CALayer屬性可以調(diào)整UIView的外觀,UIView繼承自UIResponder,CALayer不可以響應(yīng)用戶事件.
UIView是iOS系統(tǒng)中界面元素的基礎(chǔ),所有的界面元素都繼承自它.它內(nèi)部是由Core Animation來實現(xiàn)的,它真正的繪圖部分,是由一個叫CALayer(Core Animation Layer)的類來管理.UIView本身,更像是一個CALayer的管理器,訪問它的根繪圖和坐標(biāo)有關(guān)的屬性,如frame,bounds等,實際上內(nèi)部都是訪問它所在CALayer的相關(guān)屬性.
UIView有個layer屬性,可以返回它的主CALayer實例,UIView有一個layerClass方法,返回主layer所使用的類,UIView的子類可以通過重載這個方法,來讓UIView使用不同的CALayer來顯示.

6、談?wù)勀鉯OS開發(fā)中用到的設(shè)計模式設(shè)計模式

A:

常用的有四種:

1.單例模式(singleton)

  • UIApplication
  • UIScreen
  • NSNotificationCenter
  • NSFileManager
  • NSUserDefaults

2.工廠模式(factory method)
3.委托模式/代理模式(delegate)

  • AppDelegate

4.觀察者模式(observer)

  • KVO
  • 通知
8、說說你平常是怎么使用第三方API的?框架

A:

  • 例如百度、高德、騰訊等大公司的Open API
  • github上別人發(fā)布的框架
  • 商業(yè)開發(fā)中需要注意License的授權(quán)范圍,一般如果是MIT、Apache、BSD等這些License是可以隨意使用、修改、重構(gòu)、再發(fā)布等都是沒有問題的,需要注意的是GNU等一系列的License,這個License的框架,在商業(yè)開發(fā)中進(jìn)行使用的話,若沒有遵守協(xié)議內(nèi)容,可能會有被起訴的風(fēng)險.
  • 參考框架的README.md和example
  • 自己寫demo進(jìn)行測試
9、列舉一下熟悉的 iOS 第三方庫框架

A:

AFNetworking、ASIHTTPRequest、SDWebImage、YYWebImage、MJExtension、Masonry、SVProgressHUD等

10、開發(fā)過程中所使用到的查找和排序算法算法

A:

查找:
靜態(tài)查找

索引、順序表查找、有序表查找(折半查找)、靜態(tài)樹

動態(tài)查找

平衡二叉樹、二叉排序樹、哈希表

排序

希爾、快速、快速、選擇、堆、歸并、基數(shù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,212評論 30 472
  • 1,NSObject中description屬性的意義,它可以重寫嗎?答案:每當(dāng) NSLog(@"")函數(shù)中出現(xiàn) ...
    eightzg閱讀 4,192評論 2 19
  • 1.Difference between shallow copy and deep copy? 淺復(fù)制和深復(fù)制的...
    用心在飛閱讀 1,030評論 0 9
  • 1. 父類實現(xiàn)深拷貝時,子類如何實現(xiàn)深度拷貝。父類沒有實現(xiàn)深拷貝時,子類如何實現(xiàn)深度拷貝。 1.1 深拷貝同淺拷貝...
    iYeso閱讀 1,907評論 0 13
  • 一、深復(fù)制和淺復(fù)制的區(qū)別? 1、淺復(fù)制:只是復(fù)制了指向?qū)ο蟮闹羔槪磧蓚€指針指向同一塊內(nèi)存單元!而不復(fù)制指向?qū)ο蟮?..
    iOS_Alex閱讀 1,424評論 1 27