KVO的详解
观察者设计模式
主要运用到系统的isa混写技术,系统会创建一个子类添加set方法 (NSKVONotifying_A)将创建的isa的指向系统创建的类。
KVC的详解
键值编码 KVC会破坏面向对象编程的封装特性。 KVC这里的key是没有任何限制的,如果已知某个类或者实例的内部某个私有成员变量名称的话,我们在外界是可以通过已知的key来访问、设置。即破坏了面向对象的编程思想
Assign
悬垂指针:
在被assign修饰的对象,在被释放之后,assign仍然指向原对象地址。如果此时继续访问原对象,可能会导致内存泄露或者程序异常。
Weak
不改变被修饰对象的引用计数
所知对象在被释放之后会自动设置为nil
区别:Assign可以修饰对象和基本数据类型(int BOOL)Weak只能修饰对象。
可以用关联对象技术为成员添加变量
Copy
深复制复制内存
浅复制复制指针
关于离屏渲染
在屏渲染:
On-Screen Rendering,指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行。
离屏渲染:
Off-Screen Rendering,指的是GPU在当前屏幕指定缓冲区以外新开辟一个缓冲区进行渲染操作。
也就是当我们设置某些UI视图的图层属性,如果指令为 在被未预合成之前不能用于直接显示的时候,典型的比如设置视图的圆角属性,蒙层遮罩,就会触发离屏渲染。
为何避免:
卡顿掉帧
如何避免离屏渲染:
原因:
离屏渲染是发生在GPU层面,使得GPU触发了OpenGL的多通道渲染管线,产生了额外的开销。
所以
1)创建新的渲染缓冲区
增加了内存的开销,包括上下文切换,因为有多通道渲染管线,需要把多通道的渲染结果做一个最终的合成,就需要上下文切换,这就造成了GPU额外的开销。
2)离屏渲染增加了GPU的工作量,使得CPU+GPU的工作时间超出了16.7ms的总耗时,可能会导致UI的卡顿和掉帧。
代理模式
是一种以@protocol一对一的设计模式
1)在协议中可以定义方法,也可以定义属性。
单利
保证一个类只有一个实例,并且提供一个全局的访问入口访问这个实例,可以多地方使用
互斥锁
如果发现其他线程正在执行锁定代码线程会进入休眠(就绪状态),等其它线程时间片到打开锁后线程会被唤醒(执行)
自旋锁
如果发现有其它线程正在锁定代码线程会用死循环的方式,一直等待锁定的代码执行完成自旋锁更适合执行不耗时的代码
Runtime
runtime常见作用
动态交换两个方法的实现
动态添加属性
实现字典转模型的自动转换
动态添加方法
拦截并替换方法
RunLoop
使用消息循环的时候必须指定两件事情 输入事件、输入源、和定时源
消息循环模式
//1消息循环
//主线程的消息循环默认开启,子线程的消息循环默认不开启
//2消息循环的目的
//保证程序不退出
//负责处理输入事件
//输入事件和消息循环的模式
//输入事件的模式必须跟当前消息循环的模式匹配,输入事件才会执行
//子线程消息循环 run
消息循环运行在某一种消息循环模式上输入事件必须设置消息循环的模式,并且如果想让输入事件可以在消息循环上执行,输入事件的消息循环模式必须和当前消息循环的消息循环模式一致
Nsdefaultrunloolte 默认模式
Uitrackingrunloopmode当滚动 scrollview的时候,消息循环的模式自动改变
NSRunLoopCommonModes 超级二合一
内存管理
内存管理方案概述:
1)TaggedPointer,对于一些小对象,如NSNumber类;
2)NONPOINTER_ISA,非指针型的isa,对于64位架构下iOS应用程序采用NONPOINTER_ISA这种内存管理方案;在64架构下,这种isa指针占据32位或者40位比特位,剩下的比特位存储内存管理的数据内容。
3)散列表包括引用计数表和弱引用计数表。
MRC
ARC
**
Block
block调用就是函数的调用
多线程
GCD
GCD
//队列 串行队列 并行队列 全局(并行)队列 主队列
//任务
//执行 同步执行 异步执行
//各种组合
//串行队列
//同步执行 不开线程,顺序执行
//异步执行 开一个线程,顺序执行
//并行队列(全局队列)
//同步执行 不开线程,顺序执行
//异步执行 开多个线程,无序执行
//主队列
//同步执行 在主线程上执行的话会死锁
//异步执行 主线程,顺序执行
**
NSOperation
NSThread
启动流程首先调用start,创建pthread调用main方法,在调用performSelector,最后调用exit.
涉及到NSThread的考察都是结合常驻线程的,一般在对应的入口函数selector中添加一个runloop,来达到一个常驻线程的目的。