1、僵尸对象和野指针
僵尸对象:一个OC对象引用计数为0被释放后就变成僵尸对象了,僵尸对象的内存已经被系统回收,虽然可能该对象还存在,数据依然在内存中,但僵尸对象已经是不稳定对象了,不可以再访问或者使用,它的内存是随时可能被别的对象申请而占用的
野指针:指针指向的对象已经被回收掉了.这个指针就叫做野指针
EXC_BAD_ACCESS
- 野指针访问僵尸对象.有的时候会出问题报错EXC_BAD_ACCESS
空指针:是指没有指向任何东西的指针(存储的东西是nil、NULL、0),给空指针发送消息不会报错
2、自旋锁和互斥锁
自旋锁
OSSpinLock
os_unfair_lock用于取代不安全的OSSpinLock,从iOS10开始才支持
不再安全的OSSpinLock](https://blog.ibireme.com/2016/01/16/spinlock_is_unsafe_in_ios/))
atomic
- 使用atomic 修饰属性,编译器会设置默认读写方法为原子读写,并使用互斥锁添加保护
互斥锁
- NSLock
3、XML,JSON,Protobuf
xml
json
protobuf
4、NSTimer与CADisplay
CADisplayLink
iOS设备的屏幕刷新频率是固定的,CADisplayLink在正常情况下会在每次刷新结束都被调用,精确度相当高
iOS设备的屏幕刷新频率(FPS)是60Hz,因此CADisplayLink的selector 默认调用周期是每秒60次,这个周期可以通过frameInterval属性设置, CADisplayLink的selector每秒调用次数=60/ frameInterval。比如当 frameInterval设为2,每秒调用就变成30次。因此, CADisplayLink 周期的设置方式略显不便。
NSTimer
以指定的模式注册到runloop后,每当设定的周期时间到达后,runloop会向指定的target发送一次指定的selector消息
NSTimer的selector调用周期可以在初始化时直接设定,相对就灵活的多。
NSTimer的精确度就显得低了点,比如NSTimer的触发时间到的时候,runloop如果在忙于别的调用,触发时间就会推迟到下一个runloop周期
NSTimer新增了tolerance属性,让用户可以设置可以容忍的触发的时间范围。
5、iOS反射机制
获取Class
反射方法
NSStringFromClass
NSStringFromSelector
NSStringFromProtocol
常用判断方法
isKindOfClass
isMemberOfClass
conformsToProtocol
respondsToSelector
优点
- 解耦合,消除类与类之间的依赖
缺点
代码可读性降低,将原有逻辑复杂化了,不利于维护
性能较差
不宜排查错误