腾讯SNG某部门iOS面试经历

腾讯SNG面试,算是积攒一次面试经验了。可以看出,高级工程师不仅要会用一些常用库,还要懂得它们的原理。

1.APP性能优化:内存泄露检测、卡顿检测,自己做应该怎么做?


内存泄露检测:
1. Instruments工具:Leaks,Allocation.
2. MLeakFinder工具。

MLeaksFinder:精准 iOS 内存泄露检测工具
iOS内存泄漏自动检测工具PLeakSniffer

卡顿检测:
1. 开发阶段可以用CADisplayLink,添加到runloop中.
2. 线上监测,除了用第三方SDK之外,可以使用 “在子线程添加observer监测主线程”的方式.

微信读书 iOS 性能优化总结

卡顿检测的实现代码可以在这里找到:检测iOS的APP性能的一些方法

开源工具:
- FBRetainCycleDetector
- MLeaksFinder
- PLCrashreporter

2.AsycDisplayKit 原理。

AsyncDisplayKit是 Facebook 推出的用于保持界面流畅性的框架,其原理大致如下:
UI 线程中一旦出现繁重的任务就会导致界面卡顿,这类任务通常分为3类:排版,绘制,UI对象操作。
排版通常包括计算视图大小、计算文本高度、重新计算子式图的排版等操作。

绘制一般有文本绘制 (例如 CoreText)、图片绘制 (例如预先解压)、元素绘制 (Quartz)等操作。
UI对象操作通常包括 UIView/CALayer 等 UI 对象的创建、设置属性和销毁。

其中前两类操作可以通过各种方法扔到后台线程执行,而最后一类操作只能在主线程完成,并且有时后面的操作需要依赖前面操作的结果 (例如TextView创建时可能需要提前计算出文本的大小)。ASDK 所做的,就是尽量将能放入后台的任务放入后台,不能的则尽量推迟 (例如视图的创建、属性的调整)。
为此,ASDK 创建了一个名为 ASDisplayNode 的对象,并在内部封装了 UIView/CALayer,它具有和 UIView/CALayer 相似的属性,例如 frame、backgroundColor等。所有这些属性都可以在后台线程更改,开发者可以只通过 Node 来操作其内部的 UIView/CALayer,这样就可以将排版和绘制放入了后台线程。但是无论怎么操作,这些属性总需要在某个时刻同步到主线程的 UIView/CALayer 去。

ASDK 仿照 QuartzCore/UIKit 框架的模式,实现了一套类似的界面更新的机制:即在主线程的 RunLoop 中添加一个 Observer,监听了 kCFRunLoopBeforeWaiting 和 kCFRunLoopExit 事件,在收到回调时,遍历所有之前放入队列的待处理的任务,然后一一执行。

具体的代码可以看这里:_ASAsyncTransactionGroup。

3.Crash ,Bug收集 SDK的原理,自己做应该怎么做?

注册NSSetUncaughtExceptionHandler,包括两种:

  1. HandleException
  2. SignalHandler

漫谈iOS Crash收集框架
iOS崩溃捕获以及收集原理

4.Core animation 动画与UIView动画的区别,动画执行过程中是否响应事件?

  • UIView animation 由CPU执行,Core Animation由GPU执行。
  • CALayer本身不能响应事件,UIView是在CAlayer之上,增加了触摸响应,手势识别等事件响应。

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

动画执行过程中是否响应事件?

1
2
3
4
5
6
7
8
9
10
11
12
13
- (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];
}
}

经过测试,CALayer是可以响应touch事件的,而UIView的block animation在执行过程中不能响应其自身的触摸事件。

注意CALayer在动画执行过程中要是用presentationLayer属性才能获取到中间状态的layer
Core Animation 的removedOnCompletion 属性默认是YES,即动画结束之后会移除动画,CALayer会回到原来的状态

可以查看Core Animation Programming Guide 的显式动画一章。

另外附一篇有意思的文章 UIDynamics, UIKit or OpenGL? 3 Types of iOS Animations for the Star Wars,值得一读。

5.Https概念,iOS中设置https。




6.100W数据中找到最大的1W个数,使用什么数据结构?

最小堆

先拿10000个数建堆,然后一次添加剩余元素,如果大于堆顶的数(10000中最小的),将这个数替换堆顶,并调整结构使之仍然是一个最小堆,这样,遍历完后,堆中的10000个数就是所需的最大的10000个。建堆时间复杂度是O(mlogm),算法的时间复杂度为O(nmlogm)(n为10亿,m为10000)。

优化的方法:可以把所有10亿个数据分组存放,比如分别放在1000个文件中。这样处理就可以分别在每个文件的10^6个数据中找出最大的10000个数,合并到一起在再找出最终的结果。

海量数据处理 - 10亿个数中找出最大的10000个数(top K问题)

7.音视频开发,没做过,然后提到简历上的二维码扫描库 - AVFoundation。


影响二维码扫描速度的难点是什么?我回答是二维码图像的清晰度,面试官还提到了二维码图像的角度,该如何优化。

对于AVFoundation来说,有两个因素:
1. 图像分辨率
AVCaptureSession 可以设置 sessionPreset 属性,这个决定了视频输入每一帧图像质量的大小。
AVCaptureSessionPreset320x240 AVCaptureSessionPreset352x288
AVCaptureSessionPreset640x480 AVCaptureSessionPreset960x540
AVCaptureSessionPreset1280x720 AVCaptureSessionPreset1920x1080

2. 扫描范围
AVCaptureMetadataOutput 的 rectOfInterest 属性来配置解析范围

8.离屏渲染问题的本质是什么?

首先离屏渲染指的是在GPU在当前屏幕缓冲区以外开辟一个缓冲区进行渲染操作.

当使用圆角,阴影,遮罩的时候,图层属性的混合体被指定为在未预合成之前(下一个HSync信号开始前)不能直接在屏幕中绘制,所以就需要屏幕外渲染。

具体参考这篇文章:iOS-离屏渲染详解

总结:

本次面试问题侧重于实际项目,很多东西之前有看过,但都忘了大概,用到但没有深入研究是一大劣势。

所以说多多面试还是有帮助的😆!

面试必看文章:
iOS 保持界面流畅的技巧
iOS 应用稳定性监测和指标问题

iOS 性能监控方案(上篇)
iOS 性能监控方案(下篇)