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ù)