1,说说gcd底层原来,同步和异步底层是怎么做的,并行与并发有什么区别
GCD,全称Grand Central Dispatch(中央调度中心),纯C语言开发,提供了很多强大的函数。
- GCD的优势:
- GCD是苹果公司为多核并行运算提出的解决方案;
- GCD会自动利用更多的CPU内核(比如双核、四核等);
- GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)。
程序员只需要告诉GCD想要执行的任务,不需要编写任何线程管理相关代码(调度、销毁都不用管)
- GCD核心: 将任务添加到队列,并指定执行任务的函数
并行是指两个或多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生
2,对网络了解怎么样,讲讲tcp,udp,http怎么保证数据安全,怎么工作的
https是怎么工作的,https里数字证书是什么?里面包含什么东西?凭什么说https是安全的
OSI(Open System Interconnection)模型定制的七层标准模型分别是:
物理层:物理层是OSI参考模型的最低层,它利用传输介质为数据链路层提供物理连接。它主要关心的是通过物理链路从一个节点向另一个节点传送比特流,物理链路可能是铜线、卫星、微波或其他的通讯媒介。它关心的问题有:多少伏电压代表1?多少伏电压代表0?时钟速率是多少?采用全双工还是半双工传输?总的来说物理层关心的是链路的机械、电气、功能和规程特性。主要有: 以太网 · 调制解调器 · 电力线通信(PLC) · SONET/SDH · G.709 · 光导纤维 · 同轴电缆 · 双绞线等
数据链路层:数据链路层是为网络层提供服务的,解决两个相邻结点之间的通信问题,传送的协议数据单元称为 数据帧。只要协议有:Wi-Fi( IEEE 802.11) · WiMAX( IEEE 802.16) ·ATM · DTM · 令牌环 · 以太网 ·FDDI · 帧中继 · GPRS · EVDO ·HSPA · HDLC · PPP · L2TP ·PPTP · ISDN·STP 等
网络层:网络层是为传输层提供服务的,传送的协议数据单元称为 数据包或分组。该层的主要作用是解决如何使数据包通过各结点传送的问题,即通过 路径选择算法( 路由)将数据包送到目的地。另外,为避免 通信子网中出现过多的数据包而造成 网络阻塞,需要对流入的数据包数量进行控制( 拥塞控制)。当数据包要跨越多个通信子网才能到达目的地时,还要解决网际互连的问题。IP (IPv4 · IPv6) · ICMP· ICMPv6·IGMP ·IS-IS · IPsec · ARP · RARP等
传输层:TCP · UDP · TLS · DCCP · SCTP · RSVP · OSPF 等
会话层:会话层主要功能是管理和协调不同主机上各种进程之间的通信(对话),即负责建立、管理和终止应用程序之间的会话。会话层得名的原因是它很类似于两个实体间的会话概念。例如,一个交互的用户会话以登录到计算机开始,以注销结束。
表示层:表示层处理流经结点的 数据编码的表示方式问题,以保证一个系统应用层发出的信息可被另一系统的应用层读出。如果必要,该层可提供一种标准表示形式,用于将计算机内部的多种 数据表示格式转换成 网络通信中采用的标准表示形式。数据压缩和加密也是表示层可提供的转换功能之一。
物理层,数据单位:bit;
为设备提供原始比特流传输通路。将1和0转化为电流强弱来进行传输(数模转换),到达目的后再转化为1和0(模数转换)。
网络;中继器,集线器,网线,HUB
数据链路层,数据单位:帧,Frame;
在通信的实体间建立数据链路连接。将数据按标准分帧;控制对物理介质的访问方式;通常还提供错误检测和纠正。
网络;网卡,网桥,交换机
网络层,数据单位:数据包,packet;
将数据分组(打包);通过IP地址寻址在网络中结点之间构建(最佳/短)通讯链路;分组转发数据。如路由器/三层交换机的寻址功能。
网络;路由器/多层交换机,防火墙
传输层 ,数据单位:数据段,Segment;
提供应用进程之间的逻辑通信。建立连接;将多个数据包排序组成数据段;处理数据包发送错误(漏发/错发)。
计算机;进程和端口
会话层 ;
建立和管理 应用程序/网络结点 之间的通信。自动收发包(数据);自动寻址。如访问权限验证;断点续传等。
计算机;建立会话,session认证
表示层;
转换数据格式。如图片编码/解码,数据压缩/解压,加密/解密,不同系统之间的数据格式转换。
计算机:编码方式
应用层 ;
访问网络服务的接口。为操作系统或网络应用程序提供访问网络服务的接口。
计算机;应用程序,如HTTP
四次挥手:
所谓四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发。
(1)第一次挥手:客户端发送一个FIN包,用来关闭客户端和服务器的数据传送,客户端进入FIN_WAIT_1状态。
(2)第二次挥手:服务端收到FIN包后,发送一个ACK给客户端,服务端进入CLOSE_WAIT状态。
(3)第三次挥手:服务端发送一个FIN包,用来关闭服务端到客服端的数据传送,服务端进入LAST_ACK状态。
(4)第四次挥手:客户端收到FIN包,客户端进入TIME_WAIT状态,接着发送一个ACK包给服务端,服务端进入关闭状态,完成四次挥手。
实际上socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,才能使用TCP/IP协议。
总结:
1.HTTP是应用层协议,定义的是传输数据的内容以及格式的规范。
2.TCP是底层通讯协议,定义的是数据传输和连接方式的规范。
3.Socket可以支持不同的传输层协议(TCP/UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接,Socket是发动机,提供了网络通信的能力
Socket是传输控制层接口,WebSocket是应用层协议。
一个完成的HTTP协议要包含三个部分: 请求行、请求头、请求体
请求行:主要包含请求方法、请求路径、HTTP协议版本
请求头:主要包含了对客户端环境的描述,客户端请求的主机地址信息。
请求体:客户端发给服务器的具体数据,比如文件/数据
HTTP协议规定:1个完整的HTTP响应中包含以下内容:
状态行:包含了HTTP协议版本、状态吗、状态码对应的英文名称HTTP/1.1 200 OK
响应头:包含了对服务器的描述,对返回数据的描述。
实体内容:服务器返回给客户端的具体数据(图片/html/文件...)
HTTP协议定义了很多方法对应不同的资源操作,其中最常用的是GET 和 POST 方法.
GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT、PATCH
增:PUT、删:DELETE、改:POST、查:GET
数字证书是由CA颁发的证书,也叫CA证书,通常包含证书拥有者的身份信息、CA机构的签名、公钥和私钥。其中身份信息用于验证证书持有者的身份,CA签名用于保证身份的真实性,公钥和私钥用于通信过程中的加解密,保证通信的安全。
所以数字证书可以保证数字证书中的公钥确实是这个证书的所有者持有的,或者是可以用来确认对方身份的。
image.png
第三方认证
公钥被掉包,是因为客户端无法分辨传回公钥的到底是中间人,还是服务器,这也是密码学中的身份验证问题。
在HTTPS中,使用 证书 + 数字签名 来解决这个问题。
image.png
这里假设加密方式是MD5,将网站的信息加密后通过第三方机构的私钥再次进行加密,生成数字签名。
数字证书 = 网站信息 + 数字签名
假如中间人拦截后把服务器的公钥替换为自己的公钥,因为数字签名的存在,会导致客户端验证签名不匹配,这样就防止了中间人替换公钥的问题。
image.png
浏览器安装后会内置一些权威第三方认证机构的公钥,比如VeriSign、Symantec以及GlobalSign等等,验证签名的时候直接就从本地拿到相应第三方机构的公钥,对私钥加密后的数字签名进行解密得到真正的签名,然后客户端利用签名生成规则进行签名生成,看两个签名是否匹配,如果匹配认证通过,不匹配则获取证书失败。
image.png
3,小对象了解吗?存储在哪个区的,是怎么组成的?效率是怎样?
小对象类型可以存储NSNumber、NSDate 、小NSString
Tagged Pointer存储在常量区,不存储在堆上,也不需要malloc和free,所以可以直接读取,相比存储在堆区的数据读取,效率上快了3倍左右。创建的效率相比堆区快了近100倍左右
小对象类型的字符串不同于字符串常量,虽然都存储在常量池中,
小对象类型是带有数据的指针,也就是地址+值
小对象类型不会进行retain和release,也就是不需要ARC管理
image.png
小对象最高位的0xa和0xb用来判断是否是小对象类型
数据存在于倒数第二位
4,isa 指针是什么类型的?里面有哪些内容?在ARM之前是什么类型?之后又是什么类型的?
在arm64架构之前,isa就是一个普通的指针,存储着Class、Meta-Class对象的内存地址
从arm64架构开始,对isa进行了优化,变成了一个共用体(union)结构,还使用位域来存储更多的信息
image.png
image.png
image.png
ISA_BITFIELD位域
nonpointer
0,代表普通的指针,存储着Class、Meta-Class对象的内存地址
1,代表优化过,使用位域存储更多的信息
has_assoc
是否有设置过关联对象,如果没有,释放时会更快
has_cxx_dtor
是否有C++的析构函数(.cxx_destruct),如果没有,释放时会更快
shiftcls
存储着Class、Meta-Class对象的内存地址信息
magic
用于在调试时分辨对象是否未完成初始化
weakly_referenced
是否有被弱引用指向过,如果没有,释放时会更快
deallocating
对象是否正在释放
extra_rc
里面存储的值是引用计数器减1
has_sidetable_rc
引用计数器是否过大无法存储在isa中
如果为1,那么引用计数会存储在一个叫SideTable的类的属性中
5,isa指针里sidetable跟链式表有什么关系?有什么区别?sidetable 是怎么查的?
散列表的内存管理方案,在源码中是通过SideTables()结构来实现的, SideTables()中有很多SideTable数据结构, SideTables()实际是一个哈希表,即可以通过一个对象指针来找到对象的引用计数表或弱引用表在哪一个具体的SideTable中。
全局维护一个sidetables,
sideTables 是一个全局的 hash 表,用来装SideTable 结构体
sideTables 如果是真机这个表的容量是 8,不是的话容量是 64
sideTables 中以 void *(对象的地址值) 为hash key, SideTable为 value的hash 表,通过传入的对象地址值算出一个索引,通过该索引取出 SideTable. 索引相同的对象存放在同一个SideTable中
SideTable 主要结构如下:1、保证原子属性的自旋锁slock2、存储引用计数值的 RefcountMap value3、用于存储对象弱引用的weak_table_t
struct SideTable {
spinlock_t slock; // 保证原子操作的自旋锁
RefcountMap refcnts; // 引用计数的 hash 表
weak_table_t weak_table; // weak 引用全局 hash 表
};
链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的
6,网络了解有多少?知道广域网和局域网吗?有什么区别?怎么工作的?
网络分:局域网,城域网,广域网三种。
互联网(INTERNET,又译因特网、网际网),即广域网、局域网及单机按照一定的通讯协议组成的国际计算机网络。
①局域网LAN(LocalAreaNetwork):一般指覆盖范围在10公里以内,一座楼房或一个单位内部的网络。由于传输距离直接影响传输速度,因此,局域网内的通信,由于传输于距离短,传输的速率一般都比较高。目前,局域网的传输速率一般可达到10MB/S和100MB/S,高速局域网传输速率可达到1000MB/S。
②广域网WAN(WideAreaNetwork):是指远距离的、大范围的计算机网络。跨地区、跨城市、跨国家的网络都是广域网。由于广域的覆盖范围广,联网的计算机多,因此广域网上的信息量非常大,共享的信息资源很丰富。INTERNET是全球最大的广域网,它覆盖的范围遍布全世界。
③城域网MAN(MetropolitanAreaNetwork):其覆盖范围在局域网和广域网之间。一般指覆盖范围为一个城市的网络。
7,dns是怎么工作的?了解dns吗
8,讲讲内存管理,
9,线程通讯有哪几种
10,你写了RAC,base64,md5加密,讲讲,base64是加密方法吗?
MD5是不可逆的只有加密没有解密
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。 计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。md5 运算结果是一个固定长度为128位的二进制数,经过一系列的运算得到32个16进制数。
Base64是一种使用64基的位置计数法。它使用2的最大次方来代表仅可打印的ASCII 字符。这使它可用来作为电子邮件的传输编码。在Base64中的变量使用字符A-Z、a-z和0-9 ,这样共有62个字符,用来作为开始的64个数字,最后两个用来作为数字的符号在不同的系统中而不同。一些如uuencode的其他编码方法,和之后binhex的版本使用不同的64字符集来代表6个二进制数字,但是它们不叫Base64。
MD5加密算法是不可逆的,base64加密算法是可逆的
RAC是一种非对称加密算法,公钥加密,私钥解密。
11,讲一下分类与扩展的区别,运行中是怎么体现的?swift的block与oc 的
block的区别
1.分类(category)的作用
1.1作用:可以在不修改原来类的基础上,为一个类扩展方法。
1.2最主要的用法:给系统自带的类扩展方法。具体场景:(想给UIViewController的所有子类添加一个方法,如果一个一个写工程量大而且不方便维护)
2.分类中能写什么
2.1 分类中只能添加方法,不能增加属性(因为分类的结构体中没有属性列表),原则上讲他只能添加方法,不能添加属性(成员变量),实际上他是可以通过其他方式来添加属性,比如runtime。但是使用runtime也只能实现setter和getter方法,而没有成员变量,如果调用成员变量,程序还是会报错。
3.使用分类需要注意的点
3.1 分类中可以访问原来类中的成员变量,但是只能访问@protect和@public形式的变量。如果想要访问本类中的私有变量,分类和子类一样,只能通过方法来访问。
3.2 如果分类中有和原有类同名的方法,会优先调用分类中的方法,就是说会忽略原有类的方法。所以同名方法调用的优先级为:分类>本类>父类。
3.3如果多个分类中都有和原有类同名的方法,那么调用该用法的时候执行谁由编译器决定,编译器会执行最后一个参与编译的分类中的方法。
5.1类扩展(extension)是category的一个特例,有时候也被称为匿名分类; 和分类不同,类扩展即可以声明成员变量又可以声明方法。
8、类别与类扩展的区别:
1、类别原则上只能添加方法而不能添加属性(能添加属性的原因只是通过runtime解决无setter/getter方法的问题而已,如果调用_成员变量,程序还是会报错)。
2、类扩展不仅可以增加方法,还可以增加实例变量(或者属性),只是该变量默认是@private类型的。(所以作用范围只能在自身类,而不是子类或者其它地方)
3、类扩展中声明的方法没被实现,编译器会报警,但是类别中的方法没被实现编译器是不会有任何警告的,这是因为类扩展是在编译阶段被添加到类中,而分类是在运行时添加到类中。
4、类扩展不能像类别那样拥有独立的实现部分(@implementation部分),也就是说,类扩展所声明的方法必须依托对应类的实现部分来实现。
5,分类是运行时决议的,extension是编译时决议; 以声明的形式存在,没有实现(实现直接寄生于宿主的.m中); 不能为系统类添加extension;
而在swift中的extension相当于oc中的。
12,需求开发是怎么开发的,上线出现问题有什么处理版本
上线版本保持A/B版本,逐步放开,新的功能刚开始上线不会全部放开,根据用户使用情况进行放开,先放开30%,50% 70% 后面全部放开
链接
链接
13,讲一下RN,和怎么跟原生端交互的
14,6大设计原则,你在开发中是怎么设计的
设计原则
一、单一职责原则:单一职责原则要求一个接口或类只有一个原因引起变化,也就是说一个接口或一个类只有一个原则,它就只负责一件事。
二、接口隔离原则:用于处理胖接口(fat interface)所带来的问题。如果类的接口定义暴露了过多的行为,则说明这个类的接口定义内聚程度不够好。换句话说,类的接口可以被分解为多组功能函数的组合,每一组都服务于不同的客户类,而不同的客户类可以选择使用不同的功能分组。
三、依赖倒转原则:中心思想是面向接口编程
概念描述:
1、上层模块不应该依赖底层模块,它们都应该依赖于抽象。
2、抽象不应该依赖于细节,细节应该依赖于抽象。
高层模块不应该依赖低层模块,两者应依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象;中心思想是面向接口编程。
四、里氏替换原则
public class C01_Calculate {
public static void main(String[] args) {
BizCalculate bizCalculate = new BizCalculate() ;
System.out.println(bizCalculate.add(2,3));
}
}
class Calculate { }
class BaseCalculate extends Calculate {
public int add (int a,int b){
return a+b;
}
}
/**
* 这里使用组合的方式完成计算
*/
class BizCalculate extends Calculate {
private BaseCalculate baseCalculate = new BaseCalculate() ;
public int add (int a,int b){
return this.baseCalculate.add(a,b);
}
}
3、注意事项
使用继承时,遵循里氏替换原则,在子类中尽量不要重写父类的方法;子类可以扩展父类的功能,但不能改变原有父类的功能;在适当的情况下,可以通过聚合,组合,依赖等方式解决问题。
五、开闭原则
1、概念描述
开闭原则是编程中最基础、最重要的设计原则,在代码结构的设计设计时,应该考虑对扩展开放,对修改关闭,抽象思维搭建结构,具体实现扩展细节。
六、迪米特原则
1、概念描述
迪米特原则又叫最少知道原则,即一个类对自己依赖的类知道的越少越好。也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内部。对外除了提供的public方法,不对外开放任何信息。类与类关系越密切,耦合度越大,耦合的方式很多,依赖,关联,组合,聚合等。
设计模式
1、单例模式:某个类只能有一个实例,提供一个全局的访问点。
2、简单工厂:一个工厂类根据传入的参量决定创建出那一种产品类的实例。
工厂方法:定义一个创建对象的接口,让子类决定实例化那个类。
3、抽象工厂:创建相关或依赖对象的家族,而无需明确指定具体类。
4、建造者模式:封装一个复杂对象的构建过程,并可以按步骤构造。
5、原型模式:通过复制现有的实例来创建新的实例。
6、适配器模式:将一个类的方法接口转换成客户希望的另外一个接口。
7、组合模式:将对象组合成树形结构以表示“”部分-整体“”的层次结构。
8、装饰模式:动态的给对象添加新的功能。
9、代理模式:为其他对象提供一个代理以便控制这个对象的访问。
10、亨元(蝇量)模式:通过共享技术来有效的支持大量细粒度的对象。
11、外观模式:对外提供一个统一的方法,来访问子系统中的一群接口。
12、桥接模式:将抽象部分和它的实现部分分离,使它们都可以独立的变化。
13、模板模式:定义一个算法结构,而将一些步骤延迟到子类实现。
14、解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器。
15、策略模式:定义一系列算法,把他们封装起来,并且使它们可以相互替换。
16、状态模式:允许一个对象在其对象内部状态改变时改变它的行为。
17、观察者模式:对象间的一对多的依赖关系。
18、备忘录模式:在不破坏封装的前提下,保持对象的内部状态。
19、中介者模式:用一个中介对象来封装一系列的对象交互。
20、命令模式:将命令请求封装为一个对象,使得可以用不同的请求来进行参数化。
21、访问者模式:在不改变数据结构的前提下,增加作用于一组对象元素的新功能。
22、责任链模式:将请求的发送者和接收者解耦,使的多个对象都有处理这个请求的机会。
23、迭代器模式:一种遍历访问聚合对象中各个元素的方法,不暴露该对象的内部结构。
网友评论