2019-08-02

属性关键字

读写类:
readwrite
readonly

原子性:
nonatomic:
atomic:
引用计数:
assign:修饰基本数据类型及对象,修饰对象时不改变其引用计数,会产生悬垂指针
reatin:
weake: 只能修饰对象类型,不改变修饰对象的引用计数,对象释放后会被自动置为nil;
copy:

可变对象的copy和mutablecopy都是深拷贝;
不可变对象的copy是浅拷贝,mutablecopy是深拷贝;
copy方法返回的都是不可变对象;

strong:

浅拷贝:浅拷贝只是对内存地址的复制,让目标对象的指针和源对象指向同一片内存空间。
深拷贝:深拷贝让目标对象指针和源对象指针分别指向两片内容相同的内存空间。
是否开辟了新的内存空间;
深拷贝不影响引用计数,浅拷贝会改变引用计数。

UI视图相关:

卡顿

cpu:UI的计算,文本的布局、包括一些视图的绘制,图形的解码 》》 产生的位图提交给GPU
GPU:图层的合成、管理渲染

异步绘制:需要了解下

离屏渲染:GPU在当前缓存区外新开辟一个缓冲区进行渲染操作,
当我们指定了某些UI属性,标记它为在未愈合成之前,在当前屏幕上直接显示的时候就会触发离屏渲染 ,离屏渲染增加了GPU的工作量,

分类
能做的事情:
声明私有方法、 分解体积庞大的类文件、把frameWorkd的私有方法公开
能添加的内容:
实列方法、类方法、属性(只get,set方法,没有分配实列变量)、协议

分类为何不能直接声明属性?
category是表示一个指向分类的结构体指针,结构体没有属性列表.
属性=成员变量+get方法+set方法

分类实现的原理?
由运行时来决议,不同分类中含有同名方法,谁最终生效取决于谁最后进行编译分类当中的同名分类方法最终生效,添加的方法正好是系统类的同名方法,分类方法会覆盖系统方法,由于消息传递过程中优先查找数组靠前的方法;

扩展

作用:
声明私有属性、私有变量、

分类与扩展的区别:
1:分类运行时决议,扩展编译时决议
2:具有声明也有实现方法,扩展只有实现方法
3:能为系统添加分类,扩展不能为系统添加扩展

通知:

通知和代理的区别1:通知是以观察者模式实现用于跨层传递的机制,代理是以代理模式来实现的
2: 一对多,一对一
通知的实现原理:
NSNotificationCent 可能存在一个 notificationMap 或者是字典,字典的key 就是我们的notificationName ,value就是 obServes,对于同一个notificationName
可能会添加多个observe ,所以这个observe是个list (列表),这个列表当中的每一个成员应当包含通知接收的观察者,同时也包含关于这个观察者调用的方法。

KVO
什么是kvo:
1:kvo是object-c对于观察者模式的又一实现;
每次当被观察对象的某个属性值发生改变时,注册的观察者便能获得通知。
2:苹果使用了isa 混写(isa- swizzling)来实现kvo
追问- isa—swizzling 的实现原理

其实KVO是通过isa-swizzling技术实现的,主要的操作如下:

1.当为某个对象添加观察者的时候,该对象的类将被继承生成一个中间类,并使该对象的isa指针指向中间类(所以,有时候发送消息需要明确指定类型)。注意:同一个类的其它实例对象并不受影响。
2.中间类在被观察的属性的setter方法中,在改变属性值的前后分别添加了willChangeValueForKey:和didChangeValueForKey:。使其在通过KVC标准改变属性值时可以被观察到,并向观察者发送消息。
3.当移除对某个对象的所有观察后,该对象的isa指针会重新指向原有的类。

kvo的实现原理?
kvo是系统关于观察者模式的又一实现;
kvo运用了isa混写技术来动态运行时来为某一个类添加一个子类,然后重新它的setter方法,同时把原有类的isa指针指向新创建的类;

KVC
KVC(Key-value coding)键值编码,指iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值而不需要调用明确的存取方法。


block相关

截获变量相关知识点
  • 局部变量
    基本数据类型:对于基本数据类型的局部变量截获其值
    对象类型:对象类型的局部变量连同其所有权修饰符一起截获

  • 静态局部变量
    以指针形式截获局部静态变量

  • 全局变量 和静态全局变量
    不对其进行截获

问题总结:

1:对变量进行赋值时;
需要__block修饰符:局部变量(基本数据类型、对象类型)
不需要__block修饰符:静态全局变量、全局变量、静态局部变量(通过指针形式来使用操作对应变量的)

2:什么是block?

简单来说block是一个对象,是将函数及时执行上下文封装起来的对象。

3:为什么block会引起循环引用?

如果当前block对当前对象某个成员变量进行截获的话,那么这个block会对对应变量一个强引用,而当前block又由于对像有一个强引用就产生了一个自循环引用,我们可以通过声明其为__weak变量来进行循环引用的消除,如果我们定义了一个__block的声明符的话也会产生一个自循环引用,这是我们需要区分场景,一种是ARC中会产生循环引用,可以通过断环的方式去解除循环引用,但是有一个弊端就是说如果这个block没有得到调用,这个循环引用就一直得不到解除,而在MRC中是不存在循环引用的。

4:怎样理解blcok截获变量的特性?

对于基本数据类型的变量是对其值进行截获,而对于对象类型的局部变量是对其一个强引用,对于静态局部变量是以指针形式对其截获,全局变量和静态全局变量不对其进行截获。

5:关于block方面产生的循环引用,及解决方案?
比如block当中捕获的变量也是当前对象的一个成员变量,而这个block也是当前对象的一个成员变量,也就会造成自循式的循环环引用,我们可以避免自循环引用的方式加以__weak所有权修饰符的形式来解决,同时__block也会导致混合引用,


RunLoop

相关指导文章: https://www.jianshu.com/p/5ef8f28025b9

什么是runloop?
runloop是通过内部维护事件循环来对事件、消息进行管理的一个对象。
1:没有消息需要处理时,休眠以避免资源浪费;
用户态 ————>内核态(状态切换)
2:有消息处理时,立刻被唤醒。
用户态 <—— 内核态

怎样做到有事做事,没事休息的?
当我们调用cfRunLoop的run 相关的方法之后,会调用系统的一个函数much__mag同时发生了用户态向核心态的切换然后当前线程处于休眠状态。

NSRunLoopCommonModes
1:commonMode 不是实际存在的一种mode
2:commonModel是同步source/Time/observer到多个model的一种技术

事件循环机制流程图:

描述如下:
首先,进入 RunLoop (顺便通知Observer我要进入了)
然后就去处理 Timer (顺便通知 Observer 我要处理 Timer)
然后处理 Source (顺便通知 Observer 我要处理 Source)
然后判断 Source1 还有没有没有分发的任务?
--- 有的话就去处理 Source1 收到的任务包括 Timer 和Source
--- 没有的话, 就要去睡觉了
任务都处理完了,进入休眠(顺便通知 Observer 我要休眠)
休眠的时候如果有新的任务进入, RunLoop被唤醒....

RunLoop 和多线程:
runloop和多线程是一一对应的,默认情况下是没有创建runloop
怎样实现一个常驻线程?
1:为当前线程开启一个runloop;
2:向该RunLoop添加一个Port/source/observer等维持RunLoop的事件循环;
3:启动该RunLoop(也就是调用cfRunLoop的run 方法).


RunTime

指导文章: https://www.jianshu.com/p/cace322c705b

网络相关

TCP/UDP

1:TCP建立流程:

1:为何要建立3次握手?
当客服端发生请求发送了同步报文SYN到服务端,如果在传输过程中发生了超时逗留在网络路由中,发生超时后客户端会启用超时重传策略重新发送新的SYN同步报文到服务端,之后server端发送SYN同步报文、ACK确认报文到客户端,客户端再将ACK确认报文发送到服务端,这时在网络路由中逗留的超时报文传递到server端,server会以为是一次新的连接。,发送确认信息给发送端,但是当发送端没有理会的时候,接收端也就知道这是错误信息,就不会等待,也就没有资源浪费了。

DNS:

1:解释
DNS是 域名到IP地址的映射,DNS解析采用了UDP报文端口号为53且明文传输;
客户端通过DNS协议到DNS服务器请求对响应域名的一个解析,DNS把解析后的结果IP地址返回给客户端,再由客服端向IP server服务端发起请求
2:DNS解析的方式?
递归查询、迭代查询
3:DNS常见的问题?01:DNS劫持: 在向DNS服务器请求解析IP地址的过程中被钓鱼DNS服务窃听到返回一个错误的IP地址给客户端
02:DNS解析转发
4:如何防止DNS劫持呢?
01:httpDNS : 使用http协议向DNS服务器的80端口进行请求IP
02:长链接模式:

Session 、 cookie

对http无状态的特点的补充,
1:session和cookie的区别?
cookie:主要是记录用户状态,区分用户,状态保存在客户端中;
session: 记录用户状态,区分用户,状态存放在服务器端中;

2:怎么修改cookie?

  • 新cookie覆盖旧的;
  • name,path,dimin等需要与原cookie的一致

3:怎么删除cookie?

  • 新cookie覆盖旧的;
  • name,path,dimin等需要与原cookie的一致
  • 设置cookie的expires=过去的某个时间点;

4:如何保证cookie安全?

  • 对cookie进行加密
  • 只在https上携带cookie;
  • 设置cookie的httponly,防止跨站脚本攻击;

5:HTTP中 GET和POST有什么区别?

  • GET是幂等的,可缓存的,不安全的
  • post是不幂等的,安全的;

6:https的建立流程是怎么样的?

客户端会发生到服务端一个支持的加密算法列表,TLS的版本号以及随机数C,服务端接收到后回给客户端一个服务的证书(商定的加密算法、随机数s),通过非对称加密进行对称加密的秘钥传输,之后http直接的请求就通过非对称加密保护的对称加密秘钥进行后续的网络访问。
7: TCP 和UDP的区别?

TCP是面向连接的并且可靠传输以及面向字节流,包括了流量的控制和拥塞的控制;
UDP只是简单的提供了复用、分用以及差错检错的一个传输层的基本功能,udp是无连接的;

8:网络请求返回HTTP状态码有哪些?

200 - 服务器成功返回网页 404 - 请求的网页不存在 503 - 服务不可用 如: 100 (继续)
1xx (临时响应)表示临时响应并需要请求者继续执行操作的状态代码。
2xx (成功):表示成功处理了请求的状态代码。如:200 (成功)
3xx (重定向):表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。如:300 (多种选择)
4xx(请求错误):400 (错误请求) 服务器不理解请求的语法。(解决办法传参格式不正确)
5xx(服务器错误):如:500 (服务器内部错误)


多线程 GCD

数据库相关操作

方法交换

tableview 性能优化:

https://www.jianshu.com/p/04457377b48d

Block相关:
1、 什么是block?
block是对象,它封装了一段代码,这段代码可以在任何时候执行。block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。与代理协议的功能一样,也可以用于事件通信。
2、 使用block和使用delegate完成委托模式有什么优点?使用block实现委托模式,其优点是回调的block代码块定义在委托对象函数内部,使代码更为紧凑;适配对象不再需要实现具体某个protocol,代码更为简洁。
4、 _block和__weak修饰符的区别?__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。__weak只能在ARC模式下使用,也只能修饰对象,不能修饰基本数据类型。__block对象可以在block中被重新赋值,__weak不可以。

5、 Block不允许修改外部变量的值,这里所说的外部变量的值,指的是栈中指针的内存地址。__block 所起到的作用就是只要观察到该变量被 block 所持有,就将“外部变量”在栈中的内存地址放到了堆中。进而在block内部也可以修改外部变量的值。

用copy修饰的原因
block创建时默认是创建在栈上的, 超过作用域后就会被销毁, 只有使用copy才会生成一个堆block, 在作用域外被访问

架构和框架相关

整理架构流程:
独立于APP的通用层(网络请求、时长统计框架、bug统计、第三方库等)
通用业务层(针对当下公司业务组件、有些UI的封装)
中间层 (协调和解耦,与业务之前紧密联系)
业务A、业务B、业务C、业务D

业务之间解耦的方式?
1: openUrl
2: 依赖注入

SDWebIMage基本流程

核心类 负责模块
SDWebImageManager 调度各个类
SDWebImageDownloader 下载
SDImageCache 缓存, 包括内存缓存和磁盘缓存
SDWebImageCodersManager 图片解码

1:图片通过什么方式进行读写,过程是怎么样的?

以图片URL的单项hash值作为key来存储到对于的框架中,读取是通过图片请求URL所对应的key进行查找,从内存中缓存,磁盘缓存中进行对应的查找都没有再进行下载操作,采取多级缓存的方式。
2:

人事及领导问答面试题:

https://www.jianshu.com/p/7ca1737c65dc

你可能感兴趣的:(2019-08-02)