一、scoket 相关知识点(概念、三次握手四次断开、心跳包、重连以及重连次数)
Scoket 是客户端和服务端之间相互通信的桥梁,想要实现两者之间的通讯,就必须建立连接俗称三次握手。
第一次、由客户端向服务端发送 SYN 同步报文。
第二次、当服务端收到 SYN 同步报文之后,会返回给客户端 SYN 同步报文和 ACK 确认报文。
第三次、客户端会向服务端发送 ACK 确认报文,此时客户端和服务端的连接正式建立。
建立连接之后为保证两端时刻活跃,客户端需要每隔一段时间向服务端发送心跳包
有时由于网络波动或则其他一些因素导致两者断开了连接,我们需要做重连处理,一般情况重连时间2的指数级增长当达到一定次数将放弃重连。
注:SYN 同步序列编号(Synchronize Sequence Numbers)。是TCP/IP建立连接时使用的握手信号。
二、MQTT相关知识点(概念、订阅、发布、心跳包、重连)
消息队列遥测传输简称MQTT,他是发布/订阅型消息协议,MQTT协议具有轻量、简单、开放和易于实现等优点因此它适用范围非常广泛。
MQTT协议有三种身份:发布者、代理、订阅者,发布者和订阅者都为客户端,代理为服务器,同时消息的发布者也可以是订阅者。
MQTT订阅
传输的消息分为主题(Topic,可理解为消息的类型)和负载(可以理解为消息的内容)两部分
通过消息的内容我们可以得到是否订阅成功,订阅失败需要重新订阅,一般我们也会设置一个最大订阅次数,
MQTT发布
发布消息会携带主题(topic)和消息内容,我们接收到MQTT发布topic之后根据topic来做相应的处理
三、推送相关知识点
推送原理:
1、App向iOS设备发送一个注册通知,用户需要同意系统发送推送。
2、iOS设备向苹果远程推送服务器发送App的Bundle Id和设备的UDID
3、苹果推送服务器根据设备的UDID和App的Bundle Id生成deviceToken再发回给App
4、App再将deviceToken发送给远程推送服务器(自己的服务器), 由服务器保存在数据库中。
5、当自己的服务器想发送推送时, 会把用户的devicetoken和消息内容一起发送给苹果远程推送服务器
6、苹果远程推送服务器在自身已注冊Push服务的iOS设备列表中。查找有对应标识的iOS设备,并将消息发送到iOS设备
7、iOS设备接收到苹果远程服务器push过来的消息之后,找到相应的应用程序。并依照设定弹出Push通知
四、MVC、MVVM相关知识点
MVC
MVC也就是Model View Controller(模型 视图 控制器)
MVC 的特点就是View 上面显示什么东西,取决于 Model。只要 Model 数据改了,View 的显示状态会跟着更改。Model 通过 Notification 和 KVO 机制与 Controller 间接通信。
view和model之间的通信是通过Controler来完成。Controler负责初始化 Model且对model进行读写调用然后并将 Model的值 传递给 View 去解析展示。
MVC有优点也有缺点
优点是
将数据与视图分离开来,有一定可阅读性。降低了代码的耦合性有利于代码的维护。
缺点
1、自身设计的缺点
在 MVC 模式中 view 将用户交互通知给控制器。view 的控制器通过更新 Model 来反应状态的改变。Model(通常使用 Key-Value-Observation)通知控制器来更新他们负责的 view。大多数 iOS 应用程序的代码使用这种方式来组织。
2、愈发笨重的 Controller
大量的代码被堆放在controller中使Controller变得越来越臃肿,臃肿的Controller 不仅要管理自身的属性状态还要遵循许多协议,导致协议的响应代码和 controller 的逻辑代码混淆在一起很难管理和测试。
3、太过于轻量级的 Model
ARC 普及以后我们在 Model 层的实现文件中基本上看不到代码,同时与控制器的代码越来厚重形成强烈的反差。
4、遗失的网络逻辑
开发过程中,我们的大部分数据来源于网络请求,如果网络请求放在model/view中,由于网络调用大部分使用异步,可能会出现网络请求比持有它的 Model /view生命周期更长,这样会导致网络请求被提前释放。放到controller中又使控制器越来越臃肿。
MVVM
MVVM 即 Model View ViewModel(模型 视图 视图模型)
MVVM衍生于MVC,是对 MVC 的一种演进,它促进了 UI 代码与业务逻辑的分离。它正式规范了视图和控制器紧耦合的性质,并引入新的组件。
在MVVM 中,view 和 view controller正式联系在一起,我们把它们视为一个组件
view 和 view controller 都不能直接引用model,而是引用视图模型(viewModel)
viewModel 是一个放置用户输入验证逻辑,视图显示逻辑,发起网络请求和其他代码的地方
使用MVVM会轻微的增加代码量,但总体上减少了代码的复杂性
五、数据库相关知识点
iOS的存储方式有以下几种
1、plist 格式文件存储
2、NSUserDefaults 沙盒存储(个人偏好设置)
3、文件读写存储
4、解归档存储
5、数据库存储
1、plist文件 即为属性列表文件
可以存储基本数据类型常用于存储用户的设置,或存储项目中经常用到又不经常改变的数据 不适合存储大量数据,
2、文件读写存储
文件操作可通过单例 NSFileManager 处理。文件存储的路径可以代码设置。可以存储大量数据,对数据格式没有限制。
但由于数据的存取必须是一次性全部操作,所以在频繁操作数据方面性能欠缺。
3、解归档存储
对于开发中自定义的数据模型的储存,我们可以考虑使用归档储存方案。但是是使用归档保存的自定义模型需要实现NSCoding协议下的两个方法,但在大批量处理数据时,性能上仍有所欠缺。
4、数据库存储
iOS使用的数据库是SQlite3,通常在做大量数据存储或数据操作的时候开发者会去选择数据库存储。
在操作数据库的时候,很多开发者不愿去使用SQlite语句去操作数据库,因为SQlite语句比较长而且区分大小写,使用不方便,经常会借用第三方管理工具来对他进行操作,如:FMDB、Core Data等
六、进程与线程
一个应用程序只有一个进程,进程拥有独立运行所需的全部资源。一个进程中可以有一个或多个线程。进程只负责资源的调度和分配,线程才是程序真正的执行单元,负责代码的执行。
多线程
多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的。
iOS允许用户自己开辟新的线程,相对于主线程来讲,这些线程,称作子线程。
可以根据需要开辟若干子线程,子线程和主线程是 都是 独立的运行单元,各自的执行互不影响,因此能够并发执行。有效的避免了代码阻塞,提高程序的运行性能。
iOS多线程实现种类 常见的有4种:PThreads、NSThread、GCD、NSoperation和NSOPreationQueue
PThreads
PThreads基于C语言,使用难度比较大,一般是针对底层操作的线程。PThreads线程的生命周期是由程序猿来控制
NSThread
NSThread 是苹果官方提供给我们的一种面向对象的轻量级多线程解决方案,一个NSThread对象就代表一个线程。线程的生命周期由程序员来控制,程序员创建线程之后需要自己销毁,如果不销毁则造成了资源浪费。
GCD
GCD可用于多核并行的运算,会自动管理线程的生命周期
GCD有两个核心的概念,任务和队列
任务:也就是执行操作的意思
任务又分为同步执行和异步执行,
同步执行:是同步添加任务到指定队列中,在添加的任务没有执行结束前他会一直等待。直到队列里面的任务执行完毕之后才会继续执行其他任务。只能在当前线程执行任务,不具备开辟新线程的能力。
异步执行:是异步添加任务到指定队列中,添加任务后他不会做任何等待,可以继续执行其他任务。具备开辟线程的能力。
队列:也就是存放任务的队列
队列又分为串行队列和并发队列,
串行队列:每次只有一个任务被执行,让任务一个接着一个的执行只开辟了一个线程。
并发队列:同时可以执行多个任务,可以开辟多个线程。并发队列只有在异步函数下才能生效。
NSoperation和NSOPreationQueue
NSoperation和NSOPreationQueue:是对GCD更高一层的封装,但是比 GCD 更简单易用、代码可读性也更高,他也是自动管理线程的生命周期。
NSoperation和NSOPreationQueue 可以设定任务执行的优先级、可以随时取消一个操作的执行、也可以添加多个操作的依赖关系。
线程与RunLoop
线程与RunLoop密切联系在一起,每一个线程都有一个RunLoop对象,我们不能创建线程的RunLoop对象,但是我们可以获取线程的RunLoop对象。主线程的RunLoop在程序启动时默认开启。其他线程的RunLoop是默认关闭的。
Runloop 通过监控 Source 来决定有没有任务要做,有任务做时Runloop 会去找对应的 Handler 处理事件,没有任务做时,Runloop会让线程进入休眠状态,
iOS 中公开暴露出来的只有 NSDefaultRunLoopMode 和 NSRunLoopCommonModes。 NSRunLoopCommonModes 实际上是一个 Mode 的集合,默认包括 NSDefaultRunLoopMode 和 NSEventTrackingRunLoopMode。
事例:
日常开发中,与 runLoop 接触得最近可能就是通过 NSTimer 了。一个 Timer 一次只能加入到一个 RunLoop 中。我们日常使用的时候,通常就是加入到当前的 runLoop 的 default mode 中,而 ScrollView 在用户滑动时,主线程 RunLoop 会转到 UITrackingRunLoopMode 。而这个时候, Timer 就不会运行。
有如下两种解决方案:
第一种: 设置RunLoop Mode,例如NSTimer,我们指定它运行于 NSRunLoopCommonModes ,这是一个Mode的集合。注册到这个 Mode 下后,无论当前 runLoop 运行哪个 mode ,事件都能得到执行。
第二种: 另一种解决Timer的方法是,我们在另外一个线程执行和处理 Timer 事件,然后在主线程更新UI
七、控制器的生命周期
创建
1、alloc 创建对象 分配空间
2、init 初始化对象 初始化数据、
3、loadview 从nib载入视图
4、viewDidLoad 载入完成 可以自定义数据以及动态加载其他数据
5、viewWillAppear 视图即将展示
6、viewDidAppear 视图加载完成
消失
1、viewWillDisappear 视图即将消失
2、viewDidDisAppear 视图已经消失
3、delloc 视图已被销毁
八、 weak关键字,相比assign有什么不同?
weak是弱引用 使用weak修饰的对象 引用计数不会增加 weak在引用对象被释放时自动置为nil 这样就避免了野指针的出现。使用weak修饰对象可以解决循环引用。
assign可用来修饰基本数据类型,也可修饰OC的对象,但如果用assign修饰对象类型指向的是一个强指针,当指向的这个指针释放之后,它仍指向这块内存,必须要手动给置为nil,如果不置为nil 则会出现野指针
weak只能用来修饰OC对象,而且相比assign比较安全,如果指向的对象消失了,那么它会自动置为nil,不会导致野指针。
九、深拷贝与浅拷贝 copy 与 mutableCopy
浅拷贝拷贝的是对象的指针,拷贝之后两个指针指向同一块内存空间
深拷贝拷贝的不仅仅是指针而且还有对象本身也就是指针指向的内容。拷贝后的指针与之前的指针指向的地址空间不同
copy方法:如果是非可扩展类对象,则是浅拷贝。如果是可扩展类对象,则是深拷贝。
mutableCopy方法:无论是可扩展类对象还是不可扩展类对象,都是深拷贝。
十、TCP 和 UDP的区别
TCP:面向连接、传输可靠(保证数据正确性,保证数据顺序)、用于传输大量数据(流模式)、速度慢,建立连接需要开销较多(时间,系统资源)。
UDP:面向非连接、传输不可靠、用于传输少量数据(数据包模式)、速度快。
十一、 HTTP协议中 POST 方法和 GET 方法有那些区别?
- GET用于向服务器请求数据,POST用于提交数据
- GET请求,请求参数拼接形式暴露在地址栏,而POST请求参数则放在请求体里面,因此GET请求不适合用于验证密码等操作
- GET请求的URL有长度限制,POST请求不会有长度限制
十二、代理 block 通知 之间的区别
代理和block 用于两个对象一对一之间的通信。代理需要签订协议,代理对象实现代理方法,建立代理关系才能建立通信,block不需要签订复杂的协议方法 代码简洁方便。通知一般用于一对多而且对象不需要建立关系 但是代码可读性差。
十三、谈谈你对SDWebimage 加载原理的理解
SDWimage加载时分为三步,
1,从内存中查找图片,如果有就使用
2,内存中没有则从沙盒中提取如果有则使用
3,沙盒中也没有的话就直接从网络上下载 然后缓存 最后存到沙盒
十四、如何优化Tableview
- 注册重用标识符
2.避免cell的重新布局
3.提前计算并缓存cell的属性及内容
4.减少cell中控件的数量
5.不要使用ClearColor,无背景色,透明度也不要设置为0因为渲染耗时比较长
6.使用局部更新 如果只是更新某组的话,使用reloadSection进行局部更
7.加载网络数据,下载图片,使用异步加载,并缓存
8.少使用addView 给cell动态添加view
9.按需加载cell,cell滚动很快时,只加载范围内的cell
10.不要实现无用的代理方法,tableView只遵守两个协议
11.不要做多余的绘制工作。
12.使用正确的数据结构来存储数据。减少不必要的修改
十四、iOS有哪些常见的设计模式?
单例模式:
单例保证了应用程序的生命周期内仅有一个该类的实例对象,而且易于外界访问.在ios sdk中,UIApplication, NSBundle, NSNotificationCenter, NSFileManager, NSUserDefault, NSURLCache等都是单例.
代理模式:
委托Delegate是协议的一种,通过@protocol方式实现,常见的有tableView,textField等。
观察者模式:
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。在iOS中,观察者模式的具体实现有两种: 通知机制(notification)和KVO机制(Key-value Observing)
十五、数据安全及加密
a、对称加密和非对称加密的区别?
1、对称加密又称公开密钥加密,加密和解密都会用到同一个密钥,如果密钥被攻击者获得,此时加密就失去了意义。常见的对称加密算法有DES、3DES、AES、Blowfish、IDEA、RC5、RC6。
2、非对称加密又称共享密钥加密,使用一对非对称的密钥,一把叫做私有密钥,另一把叫做公有密钥;公钥加密只能用私钥来解密,私钥加密只能用公钥来解密。常见的公钥加密算法有:RSA、ElGamal、背包算法、Rabin
b、简述 SSL 加密的过程用了哪些加密方法,为何这么作?
SSL 加密,在过程中实际使用了 对称加密 和 非对称加密 的结合。主要的考虑是先使用 非对称加密 进行连接,这样做是为了避免中间人攻击秘钥被劫持,但是 非对称加密 的效率比较低。所以一旦建立了安全的连接之后,就可以使用轻量的 对称加密。
c、iOS的签名机制是怎么样的
签名机制:先将应用内容通过摘要算法,得到摘要
再用私钥对摘要进行加密得到密文
将源文本、密文、和私钥对应的公钥一并发布
验证流程:
查看公钥是否是私钥方的
然后用公钥对密文进行解密得到摘要
将APP用同样的摘要算法得到摘要,两个摘要进行比对,如果相等那么一切正常
十六、网络
1、Http 和 Https 的区别?Https为什么更加安全?
区别
1.HTTPS 需要向机构申请 CA 证书,极少免费。
2.HTTP 属于明文传输,HTTPS基于 SSL 进行加密传输。
3.HTTP 端口号为 80,HTTPS 端口号为 443 。
4.HTTPS 是加密传输,有身份验证的环节,更加安全。
安全
SSL(安全套接层) TLS(传输层安全)
以上两者在传输层之上,对网络连接进行加密处理,保障数据的完整性,更加的安全。
网友评论