1.IOS ASI http 框架
ASIHTTPRequest对CFNetwork API进行了封装
2.iOS实现断点续传
要实现断点续传的功能,通常都需要客户端记录下当前的下载进度,并在需要续传的时候通知服务端本次需要下载的内容片段。
在HTTP1.1协议(RFC2616)中定义了断点续传相关的HTTP头的Range和Content-Range字段,一个最简单的断点续传实现大概如下:
1.客户端下载一个1024K的文件,已经下载了其中512K
2.网络中断,客户端请求续传,因此需要在HTTP头中申明本次需要续传的片段:
Range:bytes=512000-
这个头通知服务端从文件的512K位置开始传输文件
3.服务端收到断点续传请求,从文件的512K位置开始传输,并且在HTTP头中增加:
Content-Range:bytes 512000-/1024000
并且此时服务端返回的HTTP状态码应该是206,而不是200。
.3.获取被下载文件的总字节数需要用到http 头部的conten-length字段获取指定路径下文件的大小
[[[NSFileManager defaultManager] attributesOfItemAtPath: FileStorePath error:nil][NSFileSize] integerValue]
.
.
4.get、post、put区别
1、POST /url 创建
2、DELETE /url/xxx 删除
3、PUT /url/xxx 更新
4、GET /url/xxx 查看
5.TCP建立连接的过程,断开连接的过程,为什么是四次握手
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
第一次挥手:当客户端的数据都传输完成后,客户端向服务端发出连接释放报文(当然数据没发完时也可以发送连接释放报文并停止发送数据),释放连接报文包含FIN标志位(FIN=1)、序列号seq=1101(100+1+1000,其中的1是建立连接时占的一个序列号)。需要注意的是客户端发出FIN报文段后只是不能发数据了,但是还可以正常收数据;另外FIN报文段即使不携带数据也要占据一个序列号。
第二次挥手:服务端收到客户端发的FIN报文后给客户端回复确认报文,确认报文包含ACK标志位(ACK=1)、确认号ack=1102(客户端FIN报文序列号1101+1)、序列号seq=2300(300+2000)。此时服务端处于关闭等待状态,而不是立马给客户端发FIN报文,这个状态还要持续一段时间,因为服务端可能还有数据没发完。
第三次挥手:服务端将最后数据(比如50个字节)发送完毕后就向客户端发出连接释放报文,报文包含FIN和ACK标志位(FIN=1,ACK=1)、确认号和第二次挥手一样ack=1102、序列号seq=2350(2300+50)。
第四次挥手:客户端收到服务端发的FIN报文后,向服务端发出确认报文,确认报文包含ACK标志位(ACK=1)、确认号ack=2351、序列号seq=1102。注意客户端发出确认报文后不是立马释放TCP连接,而是要经过2MSL(最长报文段寿命的2倍时长)后才释放TCP连接。而服务端一旦收到客户端发出的确认报文就会立马释放TCP连接,所以服务端结束TCP连接的时间要比客户端早一些。
6.MVVM
MVVM是Model-View-ViewModel的简写。它本质上就是MVC 的改进版。MVVM 就是将其中的View 的状态和行为抽象化,让我们将视图 UI 和业务逻辑分开。
7.block和通知的区别,分别适用什么场景
1.NotificationCenter 通知中心:“一对多”,在APP中,很多控制器都需要知道一个事件,应该用通知;
2.delegate 代理委托:
1,“一对一”,对同一个协议,一个对象只能设置一个代理delegate,所以单例对象就不能用代理;
2,代理更注重过程信息的传输:比如发起一个网络请求,可能想要知道此时请求是否已经开始、是否收到了数据、数据是否已经接受完成、数据接收失败
3.block(闭包)
block和delegate一样,一般都是“一对一”之间通信交互,相比代理block有以下特点
1:写法更简练,不需要写protocol、函数等等
2,block注重结果的传输:比如对于一个事件,只想知道成功或者失败,并不需要知道进行了多少或者额外的一些信息
3,block需要注意防止循环引用
8.OC中对象的结构
1.isa指针2.superclass指针3.成员变量4.类的对象方法5.类的协议信息和属性信息
9.多态
OC三大特性:封装、继承、多态
一句话概括多态:子类重写父类的方法,父类指针指向子类。例子:子类cell重写BaseCell的setModel:方法
10.Ping是什么协议
Ping是Windows、Unix和Linux系统下的一个命令。ping也属于一个通信协议,是TCP/IP协议的一部分。利用“ping”命令可以检查网络是否连通
11.MTU
mtu一般指最大传输单元。最大传输单元(Maximum Transmission Unit,MTU)用来通知对方所能接受数据服务单元的最大尺寸
12.子线程中调用connection方法,为什么不回调
因为没有加入runloop,执行完任务就销毁了,所以没有回调。
13.NSThread,GCD,NSOperation相关
NSThread
优点:比其他的两个更轻量级。
缺点:需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销。
GCD
优点:是 Apple 开发的一个多核编程的解决方法,简单易用,效率高,速度快,基于C语言,更底层更高效,并且不是Cocoa框架的一部分,自动管理线程生命周期。
缺点:使用GCD的场景如果很复杂,就有非常大的可能遇到死锁问题。
NSOperation
优点:NSOperation是OC中多线程技术的一种,是对GCD的OC包装,可设置NSOperation的依赖关系,NSOperation可以设置自身的优先级,NSOperation是一个抽象类实际开发中常用的两个类是NSInvocationOperation和NSBlockOperation,同样我们可以自定义NSOperation等。
缺点:直接使用GCD效率确实会更高效,NSOperation会多一点开销。
14.了解哪些设计模式
代理模式 观察者模式 单例 适配器 策略 装饰器 原型
15.GCD和NSOperation的区别
1、GCD底层是c写的系统服务,执行和操作都简单高效,NSOperation是GCD的封装
2、依赖关系,NSOpeartion可以通过addDependency来添加任务的依赖,GCD需要添加依赖只能通过dispatch_barrier_async
3、优先级问题,NSOpeartion可以设置queuePriority来设置优先级,跳转任务的执行先后顺序,GCD只能设置队列的优先级,且任务是根据先进先出FIFO的原则来执行的,不能设置任务的优先级。
4、自定义,可以继承NSOpeation自定义子类重写main方法来实现相关功能,GCD没有继承这种说法
5、最大任务数,NSOperation可以设置最大任务数,
6、简单高效:GCD更为简单高效,NSOperation开销会更大一点
7、NSOperation可以设置暂停,挂起等操作。
16.iOS线程锁
在多线程开发中,不可忽视的一个问题就是多个线程同时访问同一个资源时,会造成脏数据等预想不到的结果,为了避免这种现象,我们需要在访问资源的时候添加线程锁,来控制访问。
添加线程锁的方式在这主要讲三种方式:
@synchronized隐式创建锁对象
NSLock
GCD的dispatch_semaphore_t信号机制
17.二叉树的先序中序后序遍历
二叉树的遍历主要有三种:
(1)先(根)序遍历(根左右)
(2)中(根)序遍历(左根右)
(3)后(根)序遍历(左右根)
18.app如何接收到触摸事件的
1.手指触碰屏幕,屏幕感受到触摸后,将事件交由IOKit来处理。
2.IOKIT将触摸事件封装成IOHIDEvent对象,并通过mach port传递给SpringBoard进程。
mach port是进程端口,各进程间通过它来通信。Springboard是一个系统进程,可以理解为桌面系统,可以统一管理和分发系统接收到的触摸事件。
3.SpringBoard由于接收到触摸事件,因此触发了系统进程的主线程的runloop的source回调。
19.OC 的反射机制
一 定义概念
普遍的概念就是类似于java的反射机制,动态机制使得OC语言更加灵活。
反射机制就是可以根据指定的类名获取类的相关信息。
二 作用
1 根据类名获得class
2 检查继承的关系
三 使用场景
简单来讲 就是根据后台推送过来的数据,跳转指定的页面的场景使用
.