1,KVO的实现原理
KVO:简称Key-Value-Observer,观察者模式, 当某个类的实例注册成这个对象的观察者后,利用runtime的特性,底层会生成一个基于这个观察者对象所属类的新类,然后重写Setter方法,在此方法内部,添加willChangeValueForkey,和didChangeValueFoKey方法,当调用此方法时,通过Runtime的Swizzig方法,将原对象的Setter实现方法的指引指向新创建的类的这个Setter方法。就会出发观察者对象的回调方法。
2.nil,Nil,null,NULL的区别(Objetive-c)
- nil:指向一个对象的空指针
- Nil:指向一个类的空指针
- null:指向一个其他类型(基本类型,C类型)的空指针
- Null:表示集合中的空值。
空指针:没有存储任何内存地址的指针;
举例:1.NSURL *url = nil;
2.Class class = Nil
3. int *pointInt = null
4. NSArray *arr = [NSArray arraywithObjects:obj1,objc2,[NSNull null],objc3,nil];
扩展:Swift中的nil swift中的nil不是指针,表示值缺失,任何类型的Optional都可以被赋值为nil.
3.常见的动画的类有?
CABasicAnimation,CAKeyframeAnimation,CATransitionAnimation,CAAnimaitonGroup.
4.显示动画与隐式动画
- 隐式动画由 UIView animationWithDuration:animations创建的动画
- 显式动画由 BeginAnimations:context 或 CommitAnimations:context 创建的动画
隐式动画需要手动关闭,显式动画需要手动创建 隐式动画在每一个runloop中会开启一个新的事务,在这个runloop的循环周期内,所有属性的改变会被存储一起,集中一起做一个0.25 秒的动画。
5.class和struct的区别
class是引用类型,在赋值或者拷贝的时候,传递的是对象的引用指针 struct是值类型,赋值或者拷贝的时候,传递的是对象的内存拷贝
class相比于struct的优势 class可以继承,子类可以调用父类提供的方法或者特性 class的对象可以被多次引用 可以通过Deinit释放资源
struct相对于class的有点 结构简单,线程安全的,不用担心内存泄露等问题以及线程冲突
6.swift的多态
是指相同父类的一批子类,调用相同的方法,具体的实现可以不一样。
7.associatedtype关键字的作用
associatedtype字面意思是关联类型,在写泛型函数的时候,参数不确定具体是什么类型,例如T,用此关键字声明一个关联类型变量。 associatedtype T,待真正用到的时候,通过typeallies取别名的方式,来传入具体的类型。 举例
//模型
struct Model {
let age: Int
}
//协议,使用关联类型
protocol TableViewCell {
associatedtype T
func updateCell(_ data: T)
}
//遵守TableViewCell
class MyTableViewCell: UITableViewCell, TableViewCell {
typealias T = Model
func updateCell(_ data: Model) {
// do something ...
}
}
8.UDP和TCP
UDP是User Data Protocol的简称,用户数据报协议,它是一个面向非连接的协议,不需要建立连接,直接把数据包发过去。适用于一次性发送少量的的数据,对可靠性要求不高的场景,例如:多媒体教室/流媒体 特点:
- 只管发送,不管对方有没有收到
- 将数据及源与目的地放在数据包中,直接发送数据包
- 不需要建立连接,速度快
- 每个数据包的大小控制在64K以内
- 不建立连接,是不可靠协议
TCP是Transport Control Protocol的简称,传输控制协议,是基于连接的协议,在进行对话前,需要建立连接,连接的过程需要3次握手,连接后,进行数据的传输,保证数据是按序,完整的发生到目的地的。 特点:
- 建立连接,才能进行数据传输
- 数据包大小无限制
- 是可靠协议,保证安全送到
- 会进行数据的和校验,保证数据的有序且完整
- 必须建立连接,且会进行校验,效率相比UDP低
简单来说,TCP保证数据安全完整有序送到,效率低, UDP传输速度快,但有可能丢包。