iOS-笔试面试总结

来自于CSDN,地址:https://blog.csdn.net/samuelandkevin/article/details/81433071
并且不定期更新。

面试题目涉及:

(1)
2019年,iOS 面试题持续更新
2017年5月iOS招人心得(附面试题)
2018年 iOS 面试心得
出一套 iOS 高级面试题
iOS面试题总结(三)
答《 卓同学的 Swift 面试题 》
《招聘一个靠谱的 iOS》
2019 面试总结
也许,这样理解HTTPS更容易

iOS音视频小结

大厂会问:算法,数据结构,scoket原理,用过什么框架,编译原理,自己搭建的网络框架(用非官方api)
(2)设计模式有哪几种? mvc,mvvm , mvp ,分别介绍一下,runtime作用。
23种设计模式:

1.创建型模式:工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式。
创建型模式关注对象的创建过程。
2.结构型模式:适配器模式、代理模式、桥接模式、装饰模式、组合模式、外观模式、享元模式。
结构型模式关注对象和类的组织。
3.行为型模式:模板方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。

面试题之几种常见设计模式

(3)基本的问题:数据库的泛型。json xml 区别。
(4)ARC内存管理机制.
dispatch_group
dispatch_barrier
dispatch_semaphore : 为线程加锁

多线程死锁的产生以及如何避免死锁
五个案例让你明白GCD死锁
iOS线程锁及其性能
自选锁:自旋锁的效率远高于互斥锁,保持锁时间非常短,当等待时会消耗大量 CPU 资源。
对象锁:
互斥锁:多个线程安全访问竞争资源。
条件锁:根据条件决定是否继续运行线程,即线程是否被阻塞。
递归锁:同一线程中在未解锁之前还可以上锁, 执行锁中的代码。主要是用在循环或递归操作中

dispatch_semaphore_create(信号量值)[最多几个线程可访问]
dispatch_semaphore_wait(信号量,等待时间) [总信号量减1,当信号总量为0时,线程阻塞]
dispatch_semaphore_signal(信号量) [信号总量加1]

//等待异步任务完成后才执行

 dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    dispatch_queue_t queue = dispatch_queue_create("com.apple.test", DISPATCH_QUEUE_SERIAL);
    __block int number = 0;
    dispatch_async(queue, ^{
        number = 100;
        dispatch_semaphore_signal(semaphore);
    });
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    NSLog(@"等待异步任务完成后才执行,number=%d",number);
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{ /*加载图片1 */ });
dispatch_group_async(group, queue, ^{ /*加载图片2 */ });
dispatch_group_async(group, queue, ^{ /*加载图片3 */ }); 
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        // 合并图片
});

iOS 有四个任务ABCD,先执行AB,再执行CD

//方法一:
-(void)doBarrier{
    dispatch_queue_t queue = dispatch_queue_create("com.test.sx", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
        NSLog(@"AAAAAA");
    });
    dispatch_async(queue, ^{
        NSLog(@"BBBBBB");
    });
    
    dispatch_barrier_sync(queue, ^{
        NSLog(@"");
    });
    
    dispatch_async(queue, ^{
        NSLog(@"CCCCCC");
    });
    dispatch_async(queue, ^{
        NSLog(@"DDDDDD");
    });
}
//方法二:
-(void)doGroupAndNotify{
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"AAAAAA");
    });
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"BBBBBB");
    });
    dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"CCCCCC");
    });
    dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"DDDDDD");
    });
}

(5)UIViewController生命周期:

1.initWithNibName:bundle:(storyBoard, xib,纯代码布局都会执行)
2.initWithCoder(storyBoard,xib执行)
3.awakeFromNib(storyBoard,xib执行)
4.loadView
5.viewDidLoad
6.viewWillAppear
7.viewWillLayoutSubviews
8.viewDidLayoutSubviews
9.viewDidAppear
10.viewWillDisappear
11.viewDidDisappear

app生命周期
app有5种状态:
1、Not running未运行
2、Inactive未激活
3、Active激活
4、Backgroud后台
5、Suspended挂起

iOS启动执行顺序:

点击程序图标->main()->UIApplicationMain()-UIApplicationDelegate

区分(runloop,响应者链) :在一个app中间有一个button,在你手触摸屏幕点击后,到这个button收到点击事件,中间发生了什么.

(6)RunLoop相关,使用定时器要注意什么问题?
(7)总结一下你项目的难点,怎么解决。(可以谈一下断点续传,下载)
(8)地图用了什么坐标系。
(9)C指针类型转换。core graph 画图,圆点。
(10)runtime在实际开发的应用。
1.将某些OC代码转为运行时代码,探究底层,比如block的实现原理(上边已讲到);
2.拦截系统自带的方法调用(Swizzle 黑魔法),比如拦截imageNamed:、viewDidLoad、alloc;
3.实现分类也可以增加属性;
4.实现NSCoding的自动归档和自动解档;
5.实现字典和模型的自动转换。
(11)
(12)Swift面试题
socket心跳机制,通信原理,怎么跟服务器进行报文传输,怎么防止丢包,断线重连
地图多点集合怎么实现,数据量超多的时候
百度地图点聚合实现方式
信号量如何加锁
app生命周期,UIViewController生命周期
苹果最新的技术
快应用
大图片加载,分片加载,列表缓存机制.
UIViewController生命周期
(13)iOS UI事件传递与响应者链

找到第一响应者
hitTest:withEvent:(返回点击所在的视图)
pointInside:withEvent:(释放在视图的点击范围内)
不能响应:(1)userInteractionEnabled = NO (2)hidden = YES (3)透明度 alpha 小于等于0.01 (4)子视图超出了父视图区域

(14)iOS 远程消息推送 APNS推送原理和一步一步开发详解篇

苹果禁用UDID,
应用卸载重装或者系统升级,UUID会变化。
通过第三方框架openUDID获取设备唯一标识符。

(15) 2018FFMPEG跨平台iOS&Android高级开发视频教程
(16)第三方框架源码分析

SDWebImage4.0源码探究(一)面试题
SDWebImage 源码阅读笔记
【iOS开源库】SDWebImage源码阅读&原理解析

(17)iOS NSCache缓存类的详解
(18)程序员面试闪充--iOS密码学 AES,MD5,HMAC,RSA,BASE64
(19)一个int占多少个字节?
(20)【iOS沉思录】Objective-C语言的动态性总结(编译时与运行时)
(21)UIView的setNeedsLayout, layoutIfNeeded 和 layoutSubviews 方法之间的关系解释
(22)十六进制转二进制,二进制转10进制,十六进制转10进制
eg: 0110 0001 是 0x61
0001 1111 是 0x1f
0x17 是 23

十进制转二进制
除二取余,直到商为1或0,余数倒序排列
eg: 8 -> 1000 , 2 -> 10 , 4 -> 100

二进制转换为十进制
eg:11 -> 1 * 2 ^ 1 + 1* 2 ^ 0 = 3

十进制转换为十六进制
除16取余,直到商为0,余数倒序排序
eg: 120 -> 78

十六进制转换为十进制
eg:2AF5 转为 5 * 16 ^ 0 + 15 * 16 ^1 + 10 * 16 ^ 2 + 2 * 16 ^ 3 = 10997

二进制转16进制
eg: 10111011011.1001
B9B.9

16进制和二进制对应关系:
二进制 16进制
0000 -> 0
0001 -> 1
0010 -> 2
0011 -> 3
0100 -> 4
0101 -> 5
0110 -> 6
0111 -> 7
1000 -> 8
1001 -> 9
1010 -> A
1011 -> B
1100 -> C
1101 -> D
1110 -> E
1111 -> F

表示16进制方法:
1.字母H后缀表示
2.0x前缀表示
eg: BH 等价于 0xB

(23)
1.字节就是Byte,也是B
2.位就是bit也是b
3.转换关系如下:1)1KB=1024B

  1. 1B= 8b
    (24)iOS Block 详解 全局块,栈块,堆块
全局block,相当于单例,存在内存。
栈区block,变量作用域结束,block被释放
堆区block,手动管理block内存。
在ARC环境下,外界变量copy从栈区拷贝到堆区。
block和block修饰的变量从栈区拷贝到堆区。是怎么做到?
block内部有个__forwarding私有成员变量,指向__block变量。
防止循环引用:
__weak typeof(self) weakSelf = self;

(25)一个int变量被__block修饰与否的区别?
(26)Flex 布局
CSS 常见布局方式
转载-flexbox布局口诀(图文)
(27)iOS Core Animation: Advanced Techniques核心动画中文译本
iOS图片分片加载
WWDC2018 图像最佳实践
iOS 组件化 —— 路由设计思路分析
WWDC2014之iOS使用动态库
iOS插件化
ios组件化/模块化

组件化的优点:

1.组件的独立性
2.资源重用
3.高效迭代
4.加快项目编译速度

组件化的内容包含:

1.基础组件
基础配置(宏,常量)
分类
网络(AFN,SDWeb二次封装)
工具类(日期时间的处理,文件处理,设备处理)

2.功能组件:
控件(弹幕,轮播器,选项卡)
功能(断点续传,音频处理)

3.业务组件:

命令模式

CTMediator
Command:抽象命令类 提供接口
ConcreteCommand:具体命令类
Invoker:调用者
Receiver:接收者
Client:客户类
命令的
命令接收者

(28)
1.OS底层-基于C的BSD Socket
socket(),close(),bind(),accept(),connect(),send(),receive()...
2.基于Socket原生的CocoaAsyncSocket
3.基于webSocket的IM,SocketRocket
心跳:检测TCP连接的双方是否可用。
断线重连
TCP的keepAlive机制:只能保证连接的存在,但是并不能保证客户端以及服务端的可用性.
心跳机制:客户端发起心跳,如果没收到回复,主动断开连接。服务器端维护心跳间隔,约定时间没收到客户端发来的心跳,主动断开连接。
需要心跳机制的原因:在于国内运营商NAT超时。
NAT:网络地址转换.NAT设备到出去和进来的数据进行修改。映射被NAT设备淘汰,无法通信。
心跳间隔:而国内的运营商一般NAT超时的时间为5分钟,所以通常我们心跳设置的时间间隔为3-5分钟。
PingPong机制
重连机制:第一次立刻重连,第二次2秒,第三次4秒,第四次8秒...直到大于64秒就不再重连,连接成功,重置重连时间。
传输技术:分片上传、断点续传、秒传技术。
音视频的采集、编码、网络传输、解码、播放

粘包:同一时间发送几条数据,服务端只收到一条大数据。
粘包原因:TCP的Nagle算法,多次间隔小且数据量小,合成一大块封包。
断包:发送缓存去大小有限,分段发送。
解析数据机制:封包时候给每个数据包加一个长度或者一个开始结束标记。
拆包的时候按照长度或者分解符拆包。

封包发送具体过程:
定义(长度、类型)字典->json字符串->NSData(长度data)
新建可变data ->拼接长度data -> 拼接分界符data -> 拼接消息data
->调用:writeData:withTimeout:tag

拆包具体过程:
读取包头,NSData->NSDictionary,取出数据长度->读取数据长度的数据readDataToLength: withTimeout:tag:->根据长度和类型,数据处理.
数据读取完,继续读取下一数据包包头
readDataToData:[GCDAsyncSocket CRLFData] withTimeout:-1 tag:110

(29)断点续传:

实现断点续传要了解HTTP请求头Range,通过设置Range可以指定每次从网络下载数据包的大小
Range
bytes=0-499 ,从0到499的头500个字节
bytes=500-999,从500到999的第二个500字节
bytes=500- ,从500字节以后的所有字节
bytes=-500, 最后500个字节
bytes=500-599,800-899 同时指定几个范围

用原生API请求

NSURL *url = [NSURL URLWithString:@""];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
NSString *range = [NSString stringWithFormat:@"bytes=%lld-", self.currentLength];
[request setValue:range forHTTPHeaderFiled:@"Range"];

实现方式
(1)NSURLConnection
(2)NSURLSession(iOS7 新出)
有三种任务类型:
NSURLSessionDataTask : 普通的GET\POST请求
NSURLSessionDownloadTask : 文件下载
NSURLSessionUploadTask : 文件上传
注意

NSURLSessionDownloadTask* downloadTask = [session downloadTaskWithURL:url completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
}];
location就是下载好的文件写入沙盒的地址(iOS沙盒文件夹(Documents,Library,tmp))
下载完成之后会自动删除temp中的文件,开发者需要在回调中把文件移动或者复制到指定目录下
缺点就是无法监听下载进度
要监听下载进度,NSURLSessionDownloadDelegate

NSURLSessionDownloadDelegate的三个方法
didFinishDownloadingToURL 下载完毕会调用
didWriteData:totalBytesWritten:totalBytesExpectedToWrite: (这次写入的大小:已经写入沙盒的大小:文件总大小)
didResumeAtOffset:expectedTotalBytes (恢复下载后调用)

downloadTaskWithResumeData: (恢复下载)

开发遇到问题:
接收文件的NSMutableData一直内存,随着文件的下载一直变大.

解决:
NSFileHandle,对文件读取,写入,更新.
移动到文件的最后面: seekToEndFile
将数据写入沙盒: writeData
累计写入文件的长度: self.currentLength += data.length
加载完毕调用: closeFile

边下边播

iOS实现边下边播
mp4的基本格式可参考
TCP交互协议中的字节处理,查看iOS基础之字节处理(NSData,Byte,NSString转换)

解析媒体文件,最关心是视频文件的宽高,时长,码率,编码格式,帧列表,关键帧列表

开发难点:
1.解析视频的头信息(mp4)
2.播放优化(播放到未下载的地方的处理方式)

注意:
手机录制的视频都比较大,1s就得占用1M
上传服务器必须压缩

功能实现:
将视频或图片分段读取并上传服务器,NSFileHandle
读取服务器返回的分段数据并保存在本地

AVPlayer包含以下几个类:
AVURLAsset 是AVAsset的子类,负责网络连接,请求数据
AVPlayerItem 播放资源的状态。
AVPlayer 解码处理成为图像和声音
AVPlayerLayer 图像层

注意:
视频没准备好播放,不要把AVPlayerLayer图层添加到cell上,这样会造成显示的图层变成黑色.

流程:(AVFoundation可以帮我们完成)
建立连接,请求数据 AVURLAsset
数据状态管理 AVPlayerItem
解码数据 AVPlayer
音视频输出 AVPlayerLayer

手动干预系统播放器加载数据的内部实现

AVURLAsset下有一个AVAssetResourceLoader属性
AVAssetResourceLoader 负责加载数据,调用时机:AVURLAsset不知道如何去加载这个URL资源时
AVAssetResourceLoaderDelegate

怎么手动干预?回答:把目标视频URL地址的scheme替换为不能识别的scheme.

视频第一次播放,播放器获取前两个字节的数据,就是URL的contentType

注意:
大文件读取应该分段读取.不应该将视频文件一次性全部读出来.假如一个视频有 1 GB,那内存会突然爆掉

(30)
教你开发省电的 iOS app(WWDC17 观后)
耗电:
CPU处理,网络,定位,图像

app安全

手段:class-dump,tweak,反汇编,http抓包
第三方sdk:网易易盾,360,顶象
iOS应用加固:(1)字符串加密 (2)代码逻辑混淆 (3)符号混淆
网络安全: (1)DDoS高防 (2)渗透测试 (3)Web应用防火墙

模拟黑客攻击
反爬虫,防止sql注入

性能指标,监控的范围,有哪些辅助工具,提交代码时可以机器检查团队代码命名规范,线上的异常信息如何捕捉,JIRA和Confluence,iOS Monkey测试,图片预加载,无埋点技术的实现.
iOS一行代码监测FPS/内存/CPU
代码规范检测工具: 1.OCLint + xcpretty 2.sonar 3.infer 4.fauxpas
iOS代码检测入坑记事
基于Sonar的iOS代码质量检测系统

(31)
Object-c的类没有多继承,只支持单继承,如果要实现多继承的话,可以通过类别和协议的方式来实现,OC类似于多继承,是在 用protocol委托代理来实现的;可以实现多个接口,通过实现多个接口可以完成C++的多重继承;Category是类别,一般情况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系。

(32)AVFoundation/CoreMedia/VideoToolBox, Poco C/C++开源库
音视频编码解码+渲染,音视频合成
AVFoundation视频播放和录制,音视频合成写入box合成mp4,aac+h264写入box,创建音频输入,视频写入,AVAssetWriter.

(33)怎么创建一个可以释放的单例,怎么实现多继承,怎么调用c和c++
(34)

(34)消息转发的底层实现:
1.+resolveInstanceMethod:
+resolveClassMethod:(如果已添加了实现函数,消息发送,否则跳到下一步)
2.-forwardingTargetForSelector:(不是self和nil,消息发送,否则跳到下一步)
3.-methodSignatureForSelector:(函数的参数和返回值类型为nil,doesNotRecognizeSelector,否则跳到下一步)
4.-forwardInvocation:(消息发送)

答案参考资源:

招聘一个靠谱的 iOS

<1>:
iOS 常见知识点(二):RunLoop
深入理解RunLoop
《IOS—实例化讲解 RunLoop》
【iOS程序main函数之前发生了什么】

<2>:
《从经典问题来看 Copy 方法》在初学iOS的时候,可能会被灌输这么一个常识,切记NSString的property的修饰变量要写作copy,而不是strong,那么这是为什么?

<3>:
《Runtime应用之关联对象和MethodSwizzling》
《谈Runtime机制和使用的整体化梳理》
《OC最实用的runtime总结,面试、工作你看我就足够了!》

<4>:
《YYModel 源码历险记(五)YYModelPropertyMeta 神奇的 next》
《YYModel代码分析笔记》

<5>:
什么 MVC、MVVC、MVP…本质上都是一样的,核心思想是 Separated Presentation 和 Observer Synchronization
iOS 架构模式 - 简述 MVC, MVP, MVVM 和 VIPER (译)

<6>:
《无限轮播图片》
《iOS 实现时间线列表效果》

<7>:
GCD 那些事
dispatch_barrier_sync 和dispatch_barrier_async的区别

<8>:
leetcode刷题

<9>:
iOS 开发之Core Graphics(二)详解-基础篇
iOS绘图框架CoreGraphics分析

<10>:
iOS 音频录制AMR和WAV互转(支持64位)
iOS 通过(lame)将录制音频转换成Mp3

<11>UIView and layer 的关系
UIView和CALayer是啥关系?

你可能感兴趣的:(iOS-笔试面试总结)