2019-03月 面试总结

1. 一个长字符串,找出其中k个连续字符并且中间没有重复的字符串个数

  1. 就是暴力破解法循环字符串,这个就不说了,既然出了这题,肯定不会是这样的
  2. hashMap,将前key个字符放入一个hashMap中去,遍历后面,如果后面有一个字符跟hashMap中重复,就将遍历指针移到当前,继续。比如一个i指针遍历字符串,当value(j)处于[i,j)中去,将i置为j继续遍历。

2. MVVM双向绑定的实现

  1. mode-->view: 获取数据model都放入VM层,回调给controller。
  2. view-->model: 通过KVO的形式监听到值得变化,回调给VM,在VM层处理数据源的改变,view不要和model接触。

3. 一个加密M3U8视频地址到播放其播放的流程是什么?

1、根据播放地址下载m3u8文件
2、解析m3u8文件,提取文件中的片段地址、片段时间长度、解密URL等信息
3、根据上面提取的片段地址按顺序依次下载到沙盒路径下,同一个视频的多个片段下载到同一个文件夹中,并保持规则的文件名,例如0001.ts,0002.ts等
4、根据解密URL,获取加密使用的AES-128位的秘钥,为了安全考虑,可以将秘钥加密后保持到本地,然后本地的http服务在请求是将加密的秘钥解密返回给播放器
5、重新构造本地缓存的m3u8文件,将片段地址替换为本地http服务的地址,将加密key的地址替换为本地服务的地址,其它的原封不动的恢复。
6、在本地建立http file server代理本地保存的片段文件,m3u8文件,加密key文件
7、hls播放器的播放链接地址替换为本地的m3u8文件地址就可以

4. 字典底层实现原理

字典底层原理使用的是hashMap来存储,存入的时候key值&mask得到的索引,放入固定位置,取值的时候&mask得到索引到对应的地方取值。时间复杂度是O(1)

5.https在工程中解决过什么问题么?

https的一些优势、连接流程就不说了。我觉得在项目中的应用就是:可以双向验证,防止中间人攻击,更加安全。其他的暂时也没想起来

6. 现在有一个接口,在客户端请求接收数据延时,服务端响应没有问题,应该怎么快速排查问题所在?

服务端请求没问题的话,只能是我网络通信之间出了问题我总结一下原因:

  1. DNS解析延迟
  2. 中间代理发生延时
  3. 网络运行商延迟
  4. 用户网络不好
  5. 代码中一次性执行多个url导致网络达到峰值

7. 类对象中的缓存列表,方法列表结构底层结构以及为什么?

首先每个类中都有一个类对象与之对应,内部存储这该类的各种信息。
cache_t缓存列表是一个哈希表,方法名是key,value是函数的IMP地址,这样做的好处是可以快速查询进行方法调用。
方法列表method_array_t是一个二维数组,内部是method_list_t,内部是method_t结构,因为方法列表基本上在编译初期已经确定,类对象需要合并分类中的方法列表,所以采用二维数组。
[类别1方法、类别2方法、主类方法],并且类别方法在前面,这也是类别的方法优先级高的原因。

8. runloop几种模式command模式为什么可以监听两个状态

runloop的几种模式:就不多说了自行查阅吧。
runloop不是只能运行一种model么,为什么kCFRunLoopCommonModes可以监听default跟traking两种状态呢?
kCFRunLoopCommonModes作为一个占位model,它并不是一个真正的model,他作为标记位,同时监听的2种状态。但是并不是一个真正model,我猜测应该是为了应用于不同场景而设计的吧。


详解

9.一个cpu可以创建几个线程,一个电脑最多可以创建几个线程,每个线程消耗多少内存。

每个线程大约消耗1KB的内核内存空间。这块内存用于存储与线程有关的数据结构和属性。这块内存是联动内存( wired memory),无法被分页。主线程的栈空间大小为1M,而且无法修改。所有的二级线程默认分配512KB的栈空间。所以创建线程个数由系统来进行控制。内存空间有限,不可能肆无忌惮的创建线程。

10. 链表的存储结构?

数据根据物理结构分为:集合、线性、树形、图形结构
逻辑结构: 顺序结构、链式结构
链表属于线性结构 链式存储。

11. obj,seletor,imp实现流程,怎么找到imp实现的?

消息转发流程,不啰嗦了。

12. 求一个数是否是2的n次方

- (BOOL)isPowerTwo:(int)n {
     if(n <= 0)return NO;
     if(n == 1)retrun YES;
     while (n != 1) {
     int pow = n % 2;
     if (pow != 0)retrun NO;
     n = n/2;
     }
     return YES;
}
----------------------
二进制中只有一个1,并且1后面跟了n个0; 因此问题可以转化为判断1后面是否跟了n个0就可以了。
如果将这个数减去1后会发现,仅有的那个1会变为0,而原来的那n个0会变为1;因此将原来的数与去减去1后的数字进行与运算后会发现为零。


         2               10             01

         4               100            011

         8               1000          0111

         16              10000        01111

        。。。。。。。。。。。。。。。

即判断n&(n-1)=0

12. 各个排序的时间复杂度,以及数组链表的时间复杂度

排序算法 时间复杂度 空间复杂度
选择排序 O(n^2) O(1)
插入排序 O(n^2) O(1)
冒泡排序 O(n^2) O(1)
快速排序 O(log2n) O(log2n)~O(n)
堆排序 O(log2n) O(1)
归并排序 O(log2n) O(n)

13. CALayer有哪些子类

  1. CAShapeLayer绘制阴影
  2. CATextLayer绘制AttributeString
  3. CAGradientLayer 处理渐变色
  4. CAScrollLayer 处理滚动视图
  5. CATransformLayer 用来渲染3D layer的层次结构

CAAnimation子类:

  1. CAAnimationGroup
  2. CAPropertyAnimation
  3. CATransition
    CAPropertyAnimation 又包含:CABasicAnimation、CAKeyframeAnimation。
    CASpringAnimation继承于CABasicAnimation

14. 网络直播的几个协议特点

RTMP协议
实时消息传输协议,该协议是基于TCP长链接协议,默认使用端口1935。推流过程:连接、创建流,推流

  1. 握手流程: client发送C0、C1给server,server接收到C0或者C1,之后发送S0、S1,client接收到S0、S1之后,同时server接收到C0、C1这时候握手完成。
  2. connect流程:RTMP协议握手之后发送一个连接消息命令。
  3. 创建stream:向服务器发送create stream消息,解析服务器返回一个流id,一般为1、
  4. 推流:向服务端发送一个publish消息,不用等待服务端回应,直接发送音视频RTMP数据包。
    音视频RTMP消息的Payload(消息体)中都放的是按照FLV-TAG格式封的音视频包,一定要按照这个格式,否则会造成播放端无法播放,时间戳的校验可以使用(H264编码中的dts)
    RTMP将消息进行分块chunking发送,chunking块的组成:basic Header(stream id)、message Herder、extent Timestamp、chunk data
    chunk size默认是128个字节,fmt 是分块消息类型。
    特点是: 延迟率低,一般使用于采集端,专门用于流媒体开发中,支持性好,adoble flash,比较适合长时间播放,但是协议复杂,性能不高,播放支持性差,在iOS端播放需要借助解码器才能播放。

HTTP-Flv
就是 http+flv ,将音视频数据封装成FLV格式,然后通过 HTTP 协议传输给客户端,基于HTTP,基于HTTP长连接。
HLS
apple公司出的一个流媒体协议,将服务端的flv格式视频,切割成m3u8文件,内部有ext-*等索引文件,内部切片成ts文件, 需要先采集一会,才能发送到客户端,响应速度块,性能高,但是有延迟。基于HTTP长链接。

协议总结

15. 视频编码一些参数详解

  1. 采样率:在1s内对声音信号的采样次数。音频一般是44100HZ。
  2. 分辨率:多用于图像的清晰度,越高视频清晰度越高。
  3. 有损压缩/无损压缩: 是否能够完全解码出来。压缩比越高,还原度就越高
  4. 帧内压缩/帧间压缩: 帧内压缩是不考虑相邻帧冗余的信息,独立进行压缩,采用有损压缩。
    帧间压缩:通过比较时间轴上不同帧进行压缩。
  5. 码率:视频传输时单位时间传送的数据位数,码率越高,视频就越接近原生
  6. H264编码: 视频是利用人眼视觉暂留的原理,通过播放一系列的图片,使人眼产生运动的感觉。单纯传输视频画面,视频量非常大,对现有的网络和存储来说是不可接受的。为了能够使视频便于传输和存储,人们发现视频有大量重复的信息,如果将重复信息在发送端去掉,在接收端恢复出来,这样就大大减少了视频数据的文件,因此有了H.264视频压缩标准。
  7. I帧、P帧、B帧:用于表示传输的视频画面。
    I帧:关键帧,完全独立的一帧图片,视频的第一帧始终是I帧,
    P帧:预测帧,表示这一帧跟之前的关键帧(或者是P帧)之间的差别,没有完整的图像数据,只有于上一帧不同的数据。
    B帧:双向差别帧,记录的是本帧跟前后帧的差别,取得B帧的数据,需要取得前帧缓存的图画,还要解码后帧的图画进行综合比对,才能得到最终图画,因为B帧记录的是前后帧的差别,比P帧能节约更多的空间,但是解码器压力就会增大,CPU消耗大。
  8. GOP:(group of pictures)组长度,I帧跟P帧之间的关系,比如说GOP为120,如果是720, p60 的话,那就是2s一次I帧。
  9. GOP即Group of picture(图像组),指两个I帧之间的距离,Reference(参考周期)指两个P帧之间的距离。
  10. IDR图像:一个序列的第一个图像叫做IDR图像。IDR一定是I帧,反之不成立。

16 递归锁的使用场景

void foo {
lock();
do something
unlock();
}
void foo1 {
lock();
foo();
unlock();
}

当处于同一个线程的时候,当发生上述情况的时,如果使用非递归锁,会产生死锁的情况,因为已经加锁了,没有解锁又继续加锁了,产生死锁。
递归锁:会查看当前线程是否已经获取到锁了,如果获取到锁就增加对锁的引用计数。而不是发生了死锁。

17. bitcode的作用

xcode7 之后,打开bitcode、bitcode中间码上传到他自己的中心服务器后,他可以为目标安装App的设备进行优化二进制,减小安装包的下载大小。

18. TCP防止丢包大致流程

TCP跟UDP的区别就在于,TCP是面向连接的一种协议,他是属于可靠传输。
TCP的报文格式:源端口、目的端口、序列号、确认号、滑动窗口、TCP校验和、紧急指针、数据
内部有超时重发机制、验证系列号/确认号保证数据的完整性。

TCP建立连接的过程采用三次握手,已知第三次握手报文的发送序列号为1000,确认序列号为2000,请问第二次握手报文的发送序列号和确认序列号分别为?
client--server: 发送X
server--client:发送Y,确认X+1
client--server:发送X+1,确认Y+1
X+1 = 1000,Y+1 = 2000,所以得出第二次发送时1999,确认是1000

TCP协议作为一个可靠的面向流的传输协议,双全工模式(接受发送分流),其可靠性和流量控制由滑动窗口协议保证,而拥塞控制则由控制窗口结合一系列的控制算法实现。

  • TCP的包是没有IP地址的,那是IP层上的事,但是有源端口和目标端口。
  • Sequence Number是包的序号,用来解决网络包乱序(reordering)问题。
  • Acknowledgement Number就是ACK——用于确认收到,用来解决不丢包的问题
  • TCP Flag ,也就是包的类型,主要是用于操控TCP的状态机的。

19. 为什么需要三次握手四次挥手

因为握手阶段server接收到SYN之后,ACK跟SYN一同返回,ACK用于确认,SYN用于同步。所以可以一起发送。
断开的时候server接收到FIN之后意味着client没有消息发过来了,但是server还是可以继续发送消息,这时候处于半关闭的状态。server先回复一个ACK确认,然后在发送一个SYN确认关闭的请求,client返回ACK表示连接确认关闭,回收资源。

20. 除了使用系统的intstruments之外 你还使用过其他检测内存泄漏的工具么?

Clang、Infer、OCLint、MLeaksFinder

21. TCP、UDP的差异

TCP是面向连接的,UDP是无连接的。
TCP会对数据进行校验,内部有超时重发、序列号确认、重传保证数据的完整性。
TCP速度快、稳定可靠传输、三次握手、四次挥手
UDP的适用场景直播、游戏数据的传输

22. socket的创建流程

  1. 创建socket
  2. 设置socket属性
  3. 绑定端口号
  4. 收发数据
  5. 关闭socket

23. 常用的设计模式

  • 创建型模式
    单例:UIApplication;

  • 结构性模式
    代理模式:delegate
    类簇:NSNumber;
    装饰者模式:分类;
    享元模式:UITableviewCell(UITableview的重用)

  • 行为性模式
    观察者模式:KVO;
    命令模式:NSInvocation;
    策略模式:协议(protocol),

策略模式详解:定义不同的算法,分别封装起来,让它们之间可以互相替换。比如野鸡,家禽都属于禽类,都有公共的方法飞、叫,但是声音不相同,家禽不会飞,此时应该讲飞、叫方法抽离出来,分别进行实现,而不是同时写在基类中重新方法。

迭代器模式:NSArray、NSDictionary、NSSet中的objectEnumerator或者reverseObjectEnumerator方法

迭代器详解:提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。

移步检测工具

推荐阅读更多精彩内容

  • Java中如何实现代理机制(JDK、CGLIB) JDK动态代理:代理类和目标类实现了共同的接口,用到Invoca...
    Y了个J阅读 2,128评论 1 14
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 5,039评论 1 18
  • 所有知识点已整理成app app下载地址 J2EE 部分: 1.Switch能否用string做参数? 在 Jav...
    侯蛋蛋_阅读 923评论 1 3
  • 小刘学习成绩一直都不错,在班里的名次平时也算中上游,大家都以为他能考上自己的目标学校,但现实就是这么残酷,在高考时...
    b86d9d53fd1f阅读 18评论 0 0
  • 从来没有特意安排的生活,这样的生活才是有滋味,一切都是靠自己慢慢积累起来的,这样的生活才会有意义,有时候我们埋怨生...
    小麦袁阅读 32评论 0 0