面试总结
玉树临风你卓哥
不积跬步,无以至千里;不积小流,无以成江海。
展开
-
面试总结 - YYCache
YYCacheYYCache 是提供用户使用的对象,内部对 YYMemoryCache 和 YYDiskCache 功能的整合封装。为 YYMemoryCache 提供了多线程功能,而 YYDiskCache 对象本身内部封装了异步读写功能。YYMemoryCacheYYMemoryCache 内部有一个储存对象,实现分为两部分:1.第一部分,淘汰算法,这里使用一个双向链表,每个节点为 _...原创 2020-03-15 19:16:42 · 270 阅读 · 0 评论 -
面试总结 - AFN
AFN调用流程分析:AFHTTPSessionManager: 发起网络请求(例如GET);AFHTTPSessionManager内部调用dataTaskWithHTTPMethod:方法(内部处理requestSerializer);dataTaskWithHTTPMethod内部调用父类AFURLSessionManager的dataTaskWithRequest: uploadPro...原创 2020-03-15 19:14:43 · 395 阅读 · 0 评论 -
面试总结 - cookie和session区别
cookie:在网站中,http请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。cookie的出现就是为了解决这个问题,第一次登录后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当该用户发送第二次请求的时候,就会自动的把上次请求存储的cookie数据自动的携带给服务器,服务器通过浏览器携带的数据就能判断当前用户是...原创 2020-03-15 19:12:17 · 541 阅读 · 0 评论 -
面试总结 - HTTP、TCP和UDP的理解
TCP是底层通讯协议,定义的是数据传输和连接方式的规范HTTP是应用层协议,定义的是传输数据的内容的规范HTTP协议是建立在TCP协议之上的一种应用。HTTP协议中的数据是利用TCP协议传输的,所以支持HTTP也就一定支持TCP网络传输协议?网络传输协议有Http,UDP和TCP。其中UDP和TCP属于长连接,Http属于短连接。TCP:不会丢失数据,更安全,所以用于聊天。UDP:...原创 2020-03-15 19:11:33 · 619 阅读 · 0 评论 -
面试总结 - 三次握手、四次握手
三次握手:第一次握手: 客户端给服务器发送一个 SYN 报文。第二次握手: 服务器收到 SYN 报文之后,会应答一个 SYN+ACK 报文。第三次握手: 客户端收到 SYN+ACK 报文之后,会回应一个 ACK 报文。四次挥手:第一次挥手: 主机1(可以使客户端,也可以是服务器端),向主机2发送一个FIN报文段;(主机1进入FIN_WAIT_1状态)第二次挥手: 主机2收到了主机...原创 2020-03-15 19:08:31 · 919 阅读 · 0 评论 -
面试总结 - HTTPS
HTTPSHTTPS其实是有两部分组成:HTTP +SSL/ TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据。HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息SSL的位置SSL介于应用层和TCP层之间。应用层数据不再直接传递给传输...原创 2020-03-15 19:06:45 · 195 阅读 · 0 评论 -
面试总结 - HTTP请求方式
HTTP的八种请求方式GET:向服务器请求指定的资源POST:向服务器提交数据请求处理,数据被包含在请求体中。HEAD : 返回服务器上对指定资源数据的 HTTP 请求头,在不需要返回全部数据的情况。OPTIONS : 返回服务器对指定资源数据支持的 HTTP 请求方法,一般用于测试服务器功能的可用性。PUT : 向服务器上传指定的数据。DELETE : 向服务器发送请求删除指定数据。...原创 2020-03-15 19:04:51 · 370 阅读 · 0 评论 -
面试总结 - 启动优化
启动优化冷启动分为三个部分1.点击APP图标到执行main函数之前;2.执行main函数开始到didFinishLaunchingWithOptions方法之后;3.didFinishLaunching方法之后到首页渲染完成;T1阶段T1阶段的工作都是由操作系统完成的,开发者能够优化的地方不多;这个阶段主要是由dyld(dynamic loader动态连接器)来初始化运行环境,将我们...原创 2020-03-15 19:03:40 · 150 阅读 · 0 评论 -
面试总结 - 耗电优化
耗电优化1.CPU处理;2.网络请求;3.定位;4.图像渲染1.1尽可能降低 CPU、GPU 功耗;1.2少用定时器;1.3 优化I/O操作:尽量不要频繁写入小数据,最好一次性批量写入;读写大量重要数据时,可以用 dispatch_io,它提供了基于 GCD 的异步操作文件的 API,使用该 API 会优化磁盘访问;数据量大时,用数据库管理数据;2.网络优化:2.1减少、压...原创 2020-03-15 19:02:18 · 413 阅读 · 0 评论 -
面试总结 - 卡顿优化
卡顿优化:首先完成显示信息的过程是:先CPU计算数据,然后交给GPU进行渲染,最后屏幕发出垂直同步信号进行成像,当显示器发出垂直同步信号的时候,GPU还没有渲染完成,所以只能将上一次的数据显示出来,以至于当前计算的帧数据丢失,这样就产生了卡顿,当前计算的帧数据计算好只能等到下一个周期去渲染。解决卡顿现象的主要思路就是尽可能减少CPU和GPU资源的消耗。CPU:1.尽量用轻量级的对象,如不用...原创 2020-03-15 19:01:05 · 433 阅读 · 0 评论 -
面试总结 - TableView优化
正确使用reuseIdentifier来重用cells尽量使所有的view opaque,包括cell自身避免渐变,图片缩放,后台选人缓存行高如果cell内现实的内容来自web,使用异步加载,缓存请求结果使用shadowPath来画阴影减少subviews的数量尽量不适用cellForRowAtIndexPath:,如果你需要用到它,只用一次然后缓存结果使用正确的数据结构来存储数...原创 2020-03-15 19:00:06 · 293 阅读 · 0 评论 -
面试总结 - 离屏渲染
如何检测离屏渲染?1、模拟器debug-选中color Offscreen - Renderd离屏渲染的图层高亮成黄 可能存在性能问题2、真机Instrument-选中Core Animation-勾选Color Offscreen-Rendered Yellow离屏渲染的触发方式圆角 (maskToBounds并用才会触发)图层蒙版阴影光栅化为什么要避免离屏渲染?离屏渲染是...原创 2020-03-15 18:59:25 · 247 阅读 · 0 评论 -
面试总结 - 图层混合
怎么检测图层混合?1、模拟器debug- 选中 color blended layers红色区域表示图层发生了混合2、Instrument-选中Core Animation-勾选Color Blended Layers避免图层混合:1、确保控件的opaque属性设置为true,确保backgroundColor和父视图颜色一致且不透明2、如无特殊需要,不要设置低于1的alpha值3、确...原创 2020-03-15 18:58:38 · 190 阅读 · 0 评论 -
面试总结 - App启动逻辑
App启动逻辑应用启动时,会先进入main函数,main函数是整个应用的入口。内部会调用UIApplicationmain函数,该函数会创建UIApplication对象以及UIApplication的代理APPDelegate,并且会开启消息循环(程序不死的原因),当监听到有系统事件时,就会通知Appdelegate做处理。每个应用都有自己的UIApplication,他是一个单例,可以通过【...原创 2020-03-15 18:57:35 · 480 阅读 · 0 评论 -
面试总结 - UIViewController 生命周期
ViewController的生命周期中各方法执行流程如下://类的初始化方法1.+ (void)initialize;//对象初始化方法2.- (instancetype)init;//从归档初始化3.- (instancetype)initWithCoder:(NSCoder *)coder;awakeFromNib//加载视图4.- (void)loadView;//将要...原创 2020-03-15 18:56:31 · 410 阅读 · 0 评论 -
面试总结 - 缓存机制
缓存可以分为:内存数据缓存,数据库缓存,文件缓存。每次想获取数据的时候,先检测内存中有无缓存,再检测本地有无缓存(数据库\文件),最终发送网络请求,将服务器返回的网络数据进行缓存(内存,数据库,文件),以便下次读取缓存机制是二级缓存:内存缓存和本地缓存归档 解档让子类遵循NSCoding协议,并实现initWithCoder:以及encodeWithCoder:方法,这些方法会在程序归解...原创 2020-03-15 18:54:07 · 365 阅读 · 0 评论 -
面试总结 - 响应链
事件的传递:(父控件到子控件)寻找合适的view。当发生触摸事件时,runloop会通知UIApplication处理,UIApplication将该事件加入到事件队列里,UIApplication再从事件队列里取出最前面的事件(FIFO),把事件传递程序的主窗口UIWindow处理,UIWindow在试图层中找到最合适的view处理事件。寻找最合适的view:A.首先判断自己是不是可以...原创 2020-03-15 18:52:21 · 136 阅读 · 0 评论 -
面试总结 - UIView、UIWindow 和 CALayer 的区别与联系
UIView:数据UIKit.framework框架,负责渲染矩形区域的内容,为矩形区域添加内容,响应区域的触摸事件,布局和管理一个或多个子视图UIWindow:数据UIKit.framework框架,是一种特殊的UIView,通常在一个程序中只有一个UIWindow,但可以手动创建多个UIWindow,同时加到程序里.UIWindow在程序中主要起到三个作用:作为容器传递触摸消息到程序中的...原创 2020-03-15 19:24:29 · 357 阅读 · 0 评论 -
面试总结 - KVO、KVC、Notification和Delegate
KVO是OC对观察者设计模式的一种实现。KVO提供一种机制,指定一个被观察对象,当对象某个属性发生改变时,对象会获取通知,并作出相应的处理。在MVC设计架构下的项目,KVO机制很适合实现mode模型和view视图之间的通讯。实现原理:KVO就是基于runtime机制实现的,当某个类的对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的se...原创 2020-03-15 18:44:56 · 260 阅读 · 0 评论 -
面试总结 - load、initialize
+(void)load;+(void)initialize;load 和 Initialize 方法都在实例化对象之前调用,load相当于装载方法,都在main()函数之前调用,Initialize方法都在main() 函数之后调用两个方法都不能主动调用,也不需要通过 super 继承父类方法,但是 Initialize 方法会在子类没有实现的时候调用父类的该方法,而 load 不会loa...原创 2020-03-15 18:44:04 · 124 阅读 · 0 评论 -
面试总结 - 单利
单利:单例必须是唯一的,所以它才被称为单例。在一个应用程序的生命周期里,有且只有一个实例存在。单例的存在给我们提供了一个唯一的全局状态。比如我们熟悉的UIApplication(应用程序实例类) NSNotificationCenter(消息中心类) NSFileManager(文件管理类) NSUserDefaults(应用程序设置) NSURLCache(请求缓存类)都是单例。三种单利实现...原创 2020-03-15 18:41:14 · 133 阅读 · 0 评论 -
面试总结 - RunLoop
就是运行时循环,一个程序能一直运行就是基于runloop。每个线程如果想继续运行,不被释放,就必须有一个runloop来不停的跑圈,以来处理线程里面的各种事件和消息,主线程默认是开启一个runloop。也就是这个runloop才能保证我们的程序正常的运行。子线程是默认没有开启runloop的。我们创建的程序不需要显示的创建runloop;每个线程,包括程序的主线程都有与之相应的runloop对...原创 2020-03-15 18:40:22 · 267 阅读 · 0 评论 -
面试总结 - AutoreleasePool自动释放池
实现原理:AutoreleasePool并没有单独的结构,而是由若干个AutoreleasePoolPage以双向链表的形式组合而成AutoreleasePool是按线程一一对应的AutoreleasePoolPage每个对象会开辟4096字节内存id *next指针作为游标指向栈顶最新add进来的autorelease对象的下一个位置一个AutoreleasePoolPage的空间被占...原创 2020-03-15 18:36:53 · 460 阅读 · 0 评论 -
面试总结 - Weak
Weakweak释放为nil过程weak被释放为nil,需要对对象整个释放过程了解,如下是对象释放的整体流程:1、调用objc_release2、因为对象的引用计数为0,所以执行dealloc3、在dealloc中,调用了_objc_rootDealloc函数4、在_objc_rootDealloc中,调用了object_dispose函数5、调用objc_destructInsta...原创 2020-03-15 18:35:17 · 152 阅读 · 0 评论 -
面试总结 - iSA
在arm64架构之前,isa就是一个普通的指针,存储着Class、Meta-Class对象的内存地址从arm64架构开始,对isa进行了优化,变成了一个共用体(union)结构,还使用位域来存储更多的信息为什么要&ISA_MASK来获取类或元类的地址?因为从arm64位开始,isa里面存储各种信息,是一个共用体,其中shiftcls 33位才是用来存放地址。通过&ISA_MA...原创 2020-03-15 18:33:27 · 163 阅读 · 0 评论 -
面试总结 - OC方法调用流程
OC中的方法调用,其实都是转换为objc_msgSend函数的调用objc_msgSend的执行流程可以分为3大阶段1.消息发送receiver是否为nil,是->退出,否->从receiverClass的cache中查找方法,找到方法->调用方法结束查找,没找到->从receiverClass的class_rw_t中查找方法,找到方法->调用方法,结束查找,并...原创 2020-03-15 18:32:08 · 558 阅读 · 0 评论 -
面试总结 - 锁
锁的种类互斥锁、自旋锁、互斥锁、递归锁、条件锁、读写锁自旋锁 - OSSpinLock互斥锁 - os_unfair_lock递归锁/互斥锁/条件锁 - pthread_mutex互斥锁 - NSLock递归锁 - NSRecursiveLock条件锁 - NSCondition (pthread_cond_t)来实现的,常见的生产者-消费者模式条件锁 ...原创 2020-03-15 18:23:12 · 111 阅读 · 0 评论 -
面试总结 - 多线程
一个app开始运行,会开启一个进程,一个进程最少会有一个线程,也就是主线程。一个线程只能按顺序从上到下执行一段代码,如果要同时执行两段或者多段代码,就要开启两条或者多条线程。多线程的鼻祖是Mach ,Mach是第一个以多线程方式处理任务的系统,但开发中很少用Mach级的线程,因为Mach级的线程没有提供多线程的基本特性,线程之间是独立的。我们开发中实现多线程的方案有4种,两种c语言,两种...原创 2020-03-15 18:14:42 · 154 阅读 · 0 评论 -
面试总结 - GCD死锁
GCD死锁普通死锁1.队列 串行队列2.调度方法 同步调用(dispatch_sync)3.同一个Q 当前所分发到的Q 和 “外部Q” 是否是同一个Q高级死锁1.调度方法 同步阻塞调用(dispatch_barrier_sync)2.同一个Q 当前所分发到的Q 和 “外部Q” 是否是同一个Q混合死锁(混合死锁主要针对dispatch_barrier 和 dispatch_asyn...原创 2020-03-15 18:04:23 · 178 阅读 · 0 评论