1、列舉一下 Cocoa/Cocoa Touch 中常見的幾種多線程方案的實(shí)現(xiàn),并談?wù)劧嗑€程安全的幾種解決辦法以及多線程安全怎么控制?多線程
A:
方案
| 方案 | 語言 | 線程生命周期</br>是否需要手動(dòng)管理 | 簡介 |
| :-: | :-: | :-: | :-: |
| pthread | C | 需要 | 通用的API</br>跨平臺(tái)/可移植 </br>使用難度大 |
| NSThread | OC | 需要 | 面向?qū)ο?lt;/br>可直接操作線程對(duì)象 |
| GCD | C | 不需要 | 充分利用CPU的多個(gè)核心</br>旨在代替NSThread |
| NSOperation | OC | 不需要 | 基于GCD </br>更加面向?qū)ο?</br>Apple 推薦使用|
線程安全
1> 只在主線程刷新訪問UI
2> 如果要防止資源搶奪,得用synchronized
進(jìn)行加鎖保護(hù)
3> 如果異步操作要保證線程安全等問題, 盡量使用GCD(因?yàn)镚CD中有些函數(shù)默認(rèn)就是安全的)
2析校、什么情況下會(huì)發(fā)生內(nèi)存泄漏和內(nèi)存溢出?內(nèi)存管理
A:
當(dāng)程序在申請(qǐng)內(nèi)存后,沒有釋放已申請(qǐng)的內(nèi)存空間(例如一個(gè)對(duì)象或者變量使用完成后沒有釋放,這個(gè)對(duì)象一直占用著內(nèi)存),一次內(nèi)存泄露危害可以忽略,但內(nèi)存泄露堆積后果很嚴(yán)重,無論多少內(nèi)存,遲早會(huì)被占光.內(nèi)存泄露會(huì)最終會(huì)導(dǎo)致內(nèi)存溢出,導(dǎo)致程序崩潰,嚴(yán)重的可能無法上架
App Store
.
當(dāng)程序在申請(qǐng)內(nèi)存時(shí),沒有足夠的內(nèi)存空間供其使用,出現(xiàn)out of memory
;比如申請(qǐng)了一個(gè)int
,但給它存了long
才能存下的數(shù),那就是內(nèi)存溢出.
3婶熬、我們說的 Objective-C 是動(dòng)態(tài)運(yùn)行時(shí)語言,你是怎么理解這句話的?Foundation框架
A:
主要是將數(shù)據(jù)類型的確定由編譯時(shí),推遲到了運(yùn)行時(shí).
這個(gè)問題其實(shí)淺涉及到兩個(gè)概念,運(yùn)行時(shí)
和多態(tài)
.簡單來說:
運(yùn)行時(shí)機(jī)制
使我們直到運(yùn)行時(shí)才去決定一個(gè)對(duì)象的類別,以及調(diào)用該類別對(duì)象指定方法.
不同對(duì)象以自己的方式響應(yīng)相同的消息,這個(gè)能力叫做多態(tài)
.
意思就是假設(shè)動(dòng)物類(Animal)都擁有一個(gè)相同的對(duì)象方法- eat
; 那人類(Person)是屬于動(dòng)物的,狗(Dog)也屬于動(dòng)物,當(dāng)他們都繼承了 Animal 這個(gè)類后,各自實(shí)現(xiàn)各自的- eat
,但是調(diào)用時(shí)我們只需調(diào)用各自的- eat
方法.也就是不同的對(duì)象以自己的方式響應(yīng)了相同的消息.因此也可以說,運(yùn)行時(shí)機(jī)制是多態(tài)的基礎(chǔ).
4雄可、簡單說一下 App的啟動(dòng)過程,(從 main 文件開始說起)Application
A:
程序啟動(dòng)分為兩類:
1.有storyboard
2.沒有storyboard
1.main函數(shù)
2.UIApplicationMain
- 創(chuàng)建UIApplication對(duì)象
- 創(chuàng)建UIApplication的delegate對(duì)象
3.根據(jù)Info.plist獲得最主要storyboard的文件名,加載最主要的storyboard
有storyboard
- 創(chuàng)建UIWindow
- 創(chuàng)建和設(shè)置UIWindow的rootViewController
- 顯示窗口
3.delegate對(duì)象開始處理(監(jiān)聽)系統(tǒng)事件
沒有storyboard
- 程序啟動(dòng)完畢的時(shí)候, 就會(huì)調(diào)用代理的
application:didFinishLaunchingWithOptions:
方法 - 在
application:didFinishLaunchingWithOptions:
中創(chuàng)建UIWindow - 創(chuàng)建和設(shè)置UIWindow的rootViewController
- 顯示窗口(方法
makeKeyAndVisable
)
程序正常退出時(shí),UIApplicationMain函數(shù)才會(huì)返回.
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來實(shí)現(xiàn)的,它真正的繪圖部分,是由一個(gè)叫CALayer(Core Animation Layer)的類來管理.UIView本身,更像是一個(gè)CALayer的管理器,訪問它的根繪圖和坐標(biāo)有關(guān)的屬性,如frame,bounds等,實(shí)際上內(nèi)部都是訪問它所在CALayer的相關(guān)屬性.
UIView有個(gè)layer屬性,可以返回它的主CALayer實(shí)例,UIView有一個(gè)layerClass
方法,返回主layer所使用的類,UIView的子類可以通過重載這個(gè)方法,來讓UIView使用不同的CALayer來顯示.
6、談?wù)勀鉯OS開發(fā)中用到的設(shè)計(jì)模式設(shè)計(jì)模式
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,這個(gè)License的框架,在商業(yè)開發(fā)中進(jìn)行使用的話,若沒有遵守協(xié)議內(nèi)容,可能會(huì)有被起訴的風(fēng)險(xiǎn).
- 參考框架的README.md和example
- 自己寫demo進(jìn)行測試
9坐榆、列舉一下熟悉的 iOS 第三方庫框架
A:
AFNetworking拴魄、ASIHTTPRequest、SDWebImage、YYWebImage匹中、MJExtension蚀狰、Masonry、SVProgressHUD等
10职员、開發(fā)過程中所使用到的查找和排序算法算法
A:
查找:
靜態(tài)查找索引、順序表查找跛溉、有序表查找(折半查找)焊切、靜態(tài)樹
動(dòng)態(tài)查找
平衡二叉樹、二叉排序樹芳室、哈希表
排序
希爾专肪、快速、快速堪侯、選擇嚎尤、堆、歸并伍宦、基數(shù)