今天剛剛開始面試,接下來這幾天把遇到的面試題總結(jié)如下:
1.內(nèi)存管理在實(shí)際開發(fā)中的應(yīng)用(必考革屠,已經(jīng)被問兩次了)
答:
1.UITableView的數(shù)據(jù)條數(shù)太多時會消耗內(nèi)存,可以給UITableViewCell、UICollectionViewCell虽界、UITableViewHeaderFooterView設(shè)置正確的復(fù)用ID烤咧,充分復(fù)用偏陪。
2.有透明度的View(alpha值在0到1之間),opaque的值應(yīng)該設(shè)置為YES煮嫌,可以優(yōu)化渲染系統(tǒng)笛谦、提高性能。(當(dāng)alpha值為0或1時昌阿,opaque的值對性能沒有影響)
3.避免過于龐大的XIB/StoryBord文件饥脑,當(dāng)加載XIB文件的時候,所有的內(nèi)容都會被加到內(nèi)存里懦冰,如果有一個不會立刻用到的View灶轰,就是在浪費(fèi)內(nèi)存資源。
4.不要讓主線程承擔(dān)過多的任務(wù)刷钢,否則會阻塞主線程笋颤,使app失去反應(yīng)。
5.加載本地圖片時内地,應(yīng)該保證UIImageView的大小和圖片的大小相同伴澄,因?yàn)榭s放圖片是很消耗資源的,特別是在UIImageView嵌套在UIScrollView中的情況下阱缓。如果是從網(wǎng)絡(luò)加載的圖片非凌,可以等圖片加載完成以后,開啟一個子線程縮放圖片荆针,然后再放到UIImageView中敞嗡。
6.在合適的場景下選擇合適的數(shù)據(jù)類型,對于數(shù)組:使用索引查詢很快航背,使用值查詢很慢喉悴,插入刪除很慢,對于字典:用鍵來查找很快玖媚,對于集合:用值來查找很快箕肃,插入刪除很快。
7.網(wǎng)絡(luò)下載文件時壓縮(目前AFNetworking已經(jīng)默認(rèn)壓縮)
8.當(dāng)UIScrollView嵌套大量UIView時會消耗內(nèi)存最盅,可以模仿UITableView的重用方式解決突雪,當(dāng)網(wǎng)絡(luò)請求的時候可以使用延遲加載來顯示請求錯誤的頁面起惕,因?yàn)榫W(wǎng)絡(luò)請求錯誤的頁面不會馬上用到涡贱,如果每次都先加載出來會消耗內(nèi)存。
9.不大可能改變但經(jīng)常使用的東西可以使用緩存惹想,比如cell的行高可以緩存起來问词,這樣reloaddata的時候效率會很高。還有一些網(wǎng)絡(luò)數(shù)據(jù)嘀粱,不需要每次都請求的激挪,應(yīng)該緩存起來辰狡,可以寫入數(shù)據(jù)庫,也可以寫入plist文件垄分。
10.在appDelegate和UIViewController中都有處理內(nèi)存警告的方法宛篇,注冊并接受內(nèi)存警告的通知,一旦收到通知就移除緩存薄湿,釋放不需要的內(nèi)存空間叫倍。
11.一些對象的初始化很慢,比如NSDateFormatter和NSCalendar豺瘤,但你又必須要使用它吆倦,這時可以重用它們,有兩種方式坐求,第一種是添加屬性到你的類蚕泽,第二種是創(chuàng)建靜態(tài)變量(類似于單例)
12.服務(wù)器端和客戶端使用相同的數(shù)據(jù)結(jié)構(gòu),避免反復(fù)處理數(shù)據(jù)桥嗤,UIWebView中盡可能少的使用框架须妻,用原聲js最好,因?yàn)閁IView的加載比較慢砸逊。
13.在循環(huán)創(chuàng)建變量處理數(shù)據(jù)的時候璧南,使用自動釋放池可以及時的釋放內(nèi)存。
14.加載本地圖片的時候师逸,如果只使用一次使用imageWithContentOfFile方法司倚,因?yàn)閕mageNamed方法會緩存圖片,消耗內(nèi)存篓像。
總結(jié):面試時我只答了內(nèi)存管理的法則和MRC动知、ARC、自動釋放池的區(qū)別员辩,并沒有說出內(nèi)存管理在實(shí)際開發(fā)中是怎樣運(yùn)用的盒粮,完全沒有答到點(diǎn)子上。
2.多線程的實(shí)際應(yīng)用場景奠滑,回到主線程的方法 (必考丹皱,已經(jīng)被問兩次)
在實(shí)際開發(fā)中可能會有一些耗時的操作,這時可以開辟一個子線程把耗時的操作放到子線程中宋税,當(dāng)耗時操作執(zhí)行完畢以后再回到主線程刷新UI摊崭。必須要在主線程刷新UI,因?yàn)槎嗑€程是不安全的杰赛,如果在子線程中刷新UI可能會導(dǎo)致未知錯誤呢簸。
回到主線程的方法是performSelectorOnMainTread
延時執(zhí)行的代碼:performSelector:onThread:withObject:waitUntillDone:
使用GCD回到主線程的方法:dispatch_get_main_queue()
使用GCD開啟線程:dispatch_async([??s??k] )
二者的區(qū)別:dispatch_async()不受運(yùn)行循環(huán)模式的影響
總結(jié):我只回答出了多線程的概念、優(yōu)點(diǎn),而面試官主要想聽的關(guān)鍵詞是:耗時根时、開啟子線程瘦赫、回到主線程刷新UI,所答非所問蛤迎,而且回到主線程的方法名字我也沒記住确虱。這段話很重要,幾乎所有的iOS技術(shù)面試都會問到替裆,一定要熟記于心蝉娜。
3.關(guān)于GCD的理解
答:GCD中有兩個核心概念,隊(duì)列和任務(wù)扎唾。隊(duì)列存放任務(wù)召川,任務(wù)的取出遵循FIFO原則。隊(duì)列其實(shí)就是線程池胸遇,在OC中以dispatch_queue_t表示荧呐,隊(duì)列分串行隊(duì)列和并發(fā)隊(duì)列。任務(wù)其實(shí)就是線程執(zhí)行的代碼纸镊,在OC中以Block表示倍阐。在隊(duì)列中執(zhí)行任務(wù)有兩種方式:同步執(zhí)行和異步執(zhí)行。
串行隊(duì)列:任務(wù)一個一個執(zhí)行逗威。
并發(fā)隊(duì)列:同一時間有多個任務(wù)被執(zhí)行峰搪。
區(qū)別:會不會有任務(wù)放在別的線程(因?yàn)椴l(fā)隊(duì)列是取出一個任務(wù)放到別的線程,再取出一個任務(wù)放到另一個線程凯旭,由于動作很快概耻,可以忽略不計(jì),所以看起來所有任務(wù)都是一起執(zhí)行的)
同步執(zhí)行:不會開啟新的線程罐呼,任務(wù)按順序執(zhí)行鞠柄。
異步執(zhí)行:會開啟新的線程,任務(wù)可以并發(fā)執(zhí)行嫉柴。
區(qū)別:會不會開啟新的線程厌杜。
組合:
同步串行隊(duì)列:one by one
異步串行隊(duì)列:one by one (因?yàn)榍耙粋€任務(wù)不執(zhí)行完畢,隊(duì)列不會調(diào)度)
同步并行隊(duì)列:one by one (因?yàn)橥綀?zhí)行不會開啟新的線程)
異步并發(fā)隊(duì)列:可以實(shí)現(xiàn)任務(wù)的并發(fā)计螺,經(jīng)常用到
主隊(duì)列:主隊(duì)列是串行隊(duì)列夯尽,只有一個線程,那就是主線程登馒,添加到主隊(duì)列中的任務(wù)會在主線執(zhí)行匙握。通過dispatch_get_main_queue獲取主隊(duì)列。
全局隊(duì)列:全局隊(duì)列是并發(fā)隊(duì)列谊娇》喂拢可以通過dispatch_get_global_queue獲取不同級別的全局隊(duì)列。
同步主隊(duì)列:死鎖卡住不執(zhí)行济欢。
主隊(duì)列異步:one by one (因?yàn)闆]有開啟新線程)
總結(jié):我只回答出了延時操作使用gcd赠堵,使用加載動畫時用到了dispatch_after方法,都太表面了法褥,面試官想要聽的是更深層次的理解茫叭,于是問了我關(guān)于任務(wù)和隊(duì)列,我沒有想到這方面半等,以后提到gcd首先要想到的就是任務(wù)和隊(duì)列揍愁,因?yàn)槿蝿?wù)和隊(duì)列是gcd的核心概念。
4.TCP杀饵、HTTP莽囤、WebSokect的區(qū)別
答:
IP協(xié)議(網(wǎng)絡(luò)層協(xié)議)
TCP:傳輸控制協(xié)議,主要解決數(shù)據(jù)如何在網(wǎng)絡(luò)中傳輸切距,面向連接朽缎,可靠。(傳輸層協(xié)議)
UDP:用戶數(shù)據(jù)報協(xié)議谜悟,面向數(shù)據(jù)報话肖,不可靠。
HTTP:主要解決如何包裝數(shù)據(jù)葡幸。(應(yīng)用層協(xié)議)
Socket:是對TCP/IP協(xié)議的封裝最筒,Socket本身并不是協(xié)議,而是一個調(diào)用接口(API)蔚叨,通過Socket床蜘,我們才能使用TCP/IP協(xié)議。(傳輸層協(xié)議)
HTTP連接:短連接蔑水,客戶端向服務(wù)器發(fā)送一次請求悄泥,服務(wù)器端響應(yīng)連接后會立即端掉。
Socket連接:長連接肤粱,理論上客戶端和服務(wù)器端一旦建立連接將不會主動端掉弹囚。
建立Socket連接至少需要一對套接字,其中一個運(yùn)行于客戶端领曼,稱為ClientSocket鸥鹉,另一個運(yùn)行于服務(wù)器端,稱為ServerSocket庶骄。
套接字之間的連接過程分為三個步驟:服務(wù)器監(jiān)聽毁渗,客戶端請求,連接確認(rèn)单刁。
WebSocket是雙向通信協(xié)議灸异,模擬Socket協(xié)議,可以雙向發(fā)送或接受信息。HTTP是單向的肺樟。
Socket是傳輸控制層協(xié)議檐春,WebSocket是應(yīng)用層協(xié)議。
總結(jié):我自己簡歷上寫的東西我還不理解么伯,很尷尬疟暖,即使說不出來深層次的東西也應(yīng)該把他們的主要區(qū)別說出來。還有網(wǎng)絡(luò)七層模型一定要記住田柔,幾年前的面試官就問過我我就沒記住俐巴。
從底層到頂層分別是物理層、數(shù)據(jù)鏈路層硬爆、網(wǎng)絡(luò)層欣舵、傳輸層、會話層缀磕、表示層邻遏、應(yīng)用層。
5.iOS應(yīng)用程序的生命周期虐骑,最主要的是什么
application:willFinishLaunchingWithOptions: 程序啟動
application:didFinishLaunchingWithOptions: 入口准验,只執(zhí)行一次,啟動完成準(zhǔn)備開始運(yùn)行
applicationWillResignActive: 切換到非活動狀態(tài)廷没,如按下home鍵糊饱、切換程序
applicationDidBecomeActive: 切換到激活狀態(tài)
applicationDidEnterBackground: 應(yīng)用程序進(jìn)入后臺
applicationWillEnterForeground: 應(yīng)用程序?qū)⒁患せ?br>
applicationWillTerminate: 應(yīng)用程序?qū)⒁顺?/p>
App的啟動過程:
打開程序——執(zhí)行main函數(shù)——UIAPPlicationMain函數(shù)——初始化UIAPPlicationMain函數(shù)(設(shè)置代理,開啟runloop)——監(jiān)聽系統(tǒng)事件颠黎,通知AppDelegate——程序結(jié)束
總結(jié):面試官問的是應(yīng)用程序的生命周期另锋,而我答的是Viewcontroller的生命周期,面試官主要想聽到的關(guān)鍵詞應(yīng)該是:main函數(shù)狭归、UIApplicationMain夭坪、AppDelegate、runloop过椎、監(jiān)聽
另外總結(jié)一下關(guān)于runloop的知識點(diǎn):
runloop:運(yùn)行循環(huán)室梅,在程序運(yùn)行過程中循環(huán)做一些事
runloop的作用:保持程序持續(xù)運(yùn)行、處理App中的各種事件疚宇、提高資源利用率
runloop在實(shí)際項(xiàng)目中的應(yīng)用:控制線程的生命周期亡鼠、解決NSTimer在滑動時停止工作的問題、監(jiān)控應(yīng)用的卡頓敷待、性能優(yōu)化
6.iOS的核心動畫 (必考间涵,已經(jīng)被問兩次)
答:動畫有兩種基本類型:隱式動畫(一直存在,需要手動關(guān)閉)和顯式動畫(不存在榜揖,需要手動創(chuàng)建)
UIView的動畫:
UIViewAnimationOptionCurveEaseInOut //時間曲線函數(shù)勾哩,由慢到快
UIViewAnimationOptionCurveEaseIn //時間曲線函數(shù)抗蠢,由慢到特別快
UIViewAnimationOptionCurveEaseOut //時間曲線函數(shù),由快到慢
UIViewAnimationOptionTransitionFlipFromLeft //轉(zhuǎn)場從左翻轉(zhuǎn)
UIViewAnimationOptionTransitionFlipFromRight //轉(zhuǎn)場從右翻轉(zhuǎn)
UIViewAnimationOptionTransitionCurlUp //上卷轉(zhuǎn)場
UIViewAnimationOptionTransitionCurlDown //下卷轉(zhuǎn)場
用法:animateWithDuration思劳、transitionWithView
CAAnimation動畫分類:
1.基礎(chǔ)動畫(如物品放入購物車進(jìn)行移動)( CABasicAnimation)
2.關(guān)鍵幀動畫迅矛,圖片幀(如人、動物走動)( CAKeyframAnimation)
3.轉(zhuǎn)場動畫(一個到另一個場景敢艰,如翻頁)( CATransition)
4.組合動畫( CAAnimationGroup)
可以做動畫的值:
1.形狀系列:frame bounds
2.位置系列:center
3.色彩系列:alpha color
4.角度系列:transform(旋轉(zhuǎn)的角度)
總結(jié):面試官問我如何做一個閃爍的效果,我答了改變顏色册赛,正確答案應(yīng)該是改變透明度钠导,還有問我做過哪些動畫效果,我只回答了一個我做過的效果森瘪,正常應(yīng)該按照動畫的分類牡属,把所有能實(shí)現(xiàn)的效果說一遍。
7.上傳大文件
答:可以分片上傳扼睬、斷點(diǎn)續(xù)傳
總結(jié):這個功能我沒做過逮栅,沒有答出來,但至少應(yīng)該知道大文件上傳的方法窗宇。
最后總結(jié):已經(jīng)好幾年沒面試了措伐,突然面試一下發(fā)現(xiàn)自己已經(jīng)把很多基礎(chǔ)知識都忘了,而且有些概念理解的根本就不透徹军俊,需要花功夫好好學(xué)習(xí)一下侥加。雖然很多概念在平時工作中用不到,但是理解這些是一個軟件工程師的基本素養(yǎng)粪躬,連這些最基礎(chǔ)的東西都不會担败,怎么敢說自己工作了好幾年,確實(shí)慚愧啊镰官。
:( 如果想成為高級軟件工程師提前,底層原理一定要掌握,掌握了底層原理才能開發(fā)出更高質(zhì)量的程序泳唠,否則不管干了多少年狈网,也只是初級中級的水平。希望在接下來的面試中繼續(xù)總結(jié)經(jīng)驗(yàn)和學(xué)習(xí)笨腥。
...未完待續(xù)