騰訊SNG面試,算是積攢一次面試經(jīng)驗了赵誓〈蛎可以看出,高級工程師不僅要會用一些常用庫俩功,還要懂得它們的原理幻枉。
1.APP性能優(yōu)化:內(nèi)存泄露檢測、卡頓檢測,自己做應(yīng)該怎么做诡蜓?
內(nèi)存泄露檢測:
1. Instruments工具:Leaks熬甫,Allocation.
2. MLeakFinder工具。
MLeaksFinder:精準(zhǔn) iOS 內(nèi)存泄露檢測工具
iOS內(nèi)存泄漏自動檢測工具PLeakSniffer
卡頓檢測:
1. 開發(fā)階段可以用CADisplayLink蔓罚,添加到runloop中.
2. 線上監(jiān)測椿肩,除了用第三方SDK之外瞻颂,可以使用 “在子線程添加observer監(jiān)測主線程”的方式.
卡頓檢測的實現(xiàn)代碼可以在這里找到:檢測iOS的APP性能的一些方法
開源工具:
2.AsycDisplayKit 原理。
AsyncDisplayKit是 Facebook 推出的用于保持界面流暢性的框架郑象,其原理大致如下:
UI 線程中一旦出現(xiàn)繁重的任務(wù)就會導(dǎo)致界面卡頓贡这,這類任務(wù)通常分為3類:排版,繪制厂榛,UI對象操作盖矫。
排版通常包括計算視圖大小、計算文本高度击奶、重新計算子式圖的排版等操作炼彪。
繪制一般有文本繪制 (例如 CoreText)、圖片繪制 (例如預(yù)先解壓)正歼、元素繪制 (Quartz)等操作辐马。
UI對象操作通常包括 UIView/CALayer 等 UI 對象的創(chuàng)建、設(shè)置屬性和銷毀局义。
其中前兩類操作可以通過各種方法扔到后臺線程執(zhí)行喜爷,而最后一類操作只能在主線程完成,并且有時后面的操作需要依賴前面操作的結(jié)果 (例如TextView創(chuàng)建時可能需要提前計算出文本的大刑汛健)檩帐。ASDK 所做的,就是盡量將能放入后臺的任務(wù)放入后臺另萤,不能的則盡量推遲 (例如視圖的創(chuàng)建湃密、屬性的調(diào)整)。
為此四敞,ASDK 創(chuàng)建了一個名為 ASDisplayNode 的對象泛源,并在內(nèi)部封裝了 UIView/CALayer,它具有和 UIView/CALayer 相似的屬性忿危,例如 frame达箍、backgroundColor等。所有這些屬性都可以在后臺線程更改铺厨,開發(fā)者可以只通過 Node 來操作其內(nèi)部的 UIView/CALayer缎玫,這樣就可以將排版和繪制放入了后臺線程。但是無論怎么操作解滓,這些屬性總需要在某個時刻同步到主線程的 UIView/CALayer 去赃磨。
ASDK 仿照 QuartzCore/UIKit 框架的模式,實現(xiàn)了一套類似的界面更新的機制:即在主線程的 RunLoop 中添加一個 Observer洼裤,監(jiān)聽了 kCFRunLoopBeforeWaiting 和 kCFRunLoopExit 事件邻辉,在收到回調(diào)時,遍歷所有之前放入隊列的待處理的任務(wù),然后一一執(zhí)行恩沛。
具體的代碼可以看這里:_ASAsyncTransactionGroup在扰。
3.Crash ,Bug收集 SDK的原理雷客,自己做應(yīng)該怎么做芒珠?
注冊NSSetUncaughtExceptionHandler,包括兩種:
- HandleException
- SignalHandler
4.Core animation 動畫與UIView動畫的區(qū)別,動畫執(zhí)行過程中是否響應(yīng)事件搅裙?
- UIView animation 由CPU執(zhí)行皱卓,Core Animation由GPU執(zhí)行。
- CALayer本身不能響應(yīng)事件部逮,UIView是在CAlayer之上娜汁,增加了觸摸響應(yīng),手勢識別等事件響應(yīng)。
Core Animation is not executed on the CPU. Their commands are more offloaded to the GPU and used to create the graphics that are shown on the screen, powered by the GPU hardware.
Core Graphics is entirely done on the CPU, and cannot be performed on the GPU. Because it is an entirely CPU-bound operation, it is sometimes slower on older devices (e.g. the iPad 2 or the iPad 3rd Generation). This is something you need to keep in mind when using it in your apps. But, the good thing about Core Graphics is you can combine it with Core Animation.
Advanced Graphics with Core Animation
Core Animation does the rest, handing most of the actual drawing work off to the onboard graphics hardware to accelerate the rendering. This automatic graphics acceleration results in high frame rates and smooth animations without burdening the CPU and slowing down your app.
Core Animation Programming Guide
動畫執(zhí)行過程中是否響應(yīng)事件兄朋?
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
NSLog(@"%s",__func__);
UITouch *touch = [touches anyObject];
CGPoint point = [touch locationInView:self.view];
if (CGRectContainsPoint(self.colorLayer.presentationLayer.frame, point)) {
[self startAnimation];
}
if (CGRectContainsPoint(self.myView.frame, point)) {
[self startUIViewAnimation:nil];
}
}
經(jīng)過測試掐禁,CALayer是可以響應(yīng)touch事件的,而UIView的block animation在執(zhí)行過程中不能響應(yīng)其自身的觸摸事件。
注意CALayer在動畫執(zhí)行過程中要是用presentationLayer屬性才能獲取到中間狀態(tài)的layer
Core Animation 的removedOnCompletion 屬性默認是YES颅和,即動畫結(jié)束之后會移除動畫傅事,CALayer會回到原來的狀態(tài)
可以查看Core Animation Programming Guide 的顯式動畫一章。
另外附一篇有意思的文章 UIDynamics, UIKit or OpenGL? 3 Types of iOS Animations for the Star Wars,值得一讀峡扩。
5.Https概念蹭越,iOS中設(shè)置https。
略
6.100W數(shù)據(jù)中找到最大的10W教届,使用什么數(shù)據(jù)結(jié)構(gòu)响鹃?
堆
海量數(shù)據(jù)處理 - 10億個數(shù)中找出最大的10000個數(shù)(top K問題)
7.音視頻開發(fā),沒做過案训,然后提到簡歷上的二維碼掃描庫 - AVFoundation买置。
影響二維碼掃描速度的難點是什么?我回答是二維碼圖像的清晰度萤衰,面試官還提到了二維碼圖像的角度堕义,該如何優(yōu)化。
對于AVFoundation來說脆栋,有兩個因素:
-
圖像分辨率
AVCaptureSession 可以設(shè)置 sessionPreset 屬性,這個決定了視頻輸入每一幀圖像質(zhì)量的大小洒擦。- AVCaptureSessionPreset320x240
- AVCaptureSessionPreset352x288
- AVCaptureSessionPreset640x480
- AVCaptureSessionPreset960x540
- AVCaptureSessionPreset1280x720
- AVCaptureSessionPreset1920x1080
掃描范圍
AVCaptureMetadataOutput 的 rectOfInterest 屬性來配置解析范圍
8.離屏渲染問題的本質(zhì)是什么椿争?
首先離屏渲染指的是在GPU在當(dāng)前屏幕緩沖區(qū)以外開辟一個緩沖區(qū)進行渲染操作.
當(dāng)使用圓角,陰影熟嫩,遮罩的時候秦踪,圖層屬性的混合體被指定為在未預(yù)合成之前(下一個HSync信號開始前)不能直接在屏幕中繪制,所以就需要屏幕外渲染。
具體參考這篇文章:iOS-離屏渲染詳解
總結(jié):
本次面試問題側(cè)重于實際項目椅邓,很多東西之前有看過柠逞,但都忘了大概,用到但沒有深入研究是一大劣勢景馁。
所以說多多面試還是有幫助的??板壮!
面試必看文章:
iOS 保持界面流暢的技巧
iOS 應(yīng)用穩(wěn)定性監(jiān)測和指標(biāo)問題