1.说一下kvo以及底层实现,kvo其实调用了什么方法
当需要对一个对象a进行监听时,系统会生成一个a当前类A的子类NSKVONotifying_A,NSKVONotifying_A中会重写setter方法,a的isa指针由指向A变为指向NSKVONotifying_A,重写的setter方法负责在调用原setter方法之前和之后通知所有观察者
image.png
kvo实际调用了willChangeValueForKey和didChangeValueForKey
2.runtime在项目中的使用
1.动态添加成员变量和方法
2.拦截系统自带的方法调用
3.字典和模型的相互转换
4.给系统的类增加属性
3.属性的几种修饰词
属性的修饰词:
atomic/nonatomic,assign/retain/weak/strong/copy,readolny/readwrite
4.delegate可以用assign吗
delegate可以用assign,assign和weak修饰的对象被引用时,引用计数都不会+1,但是在释放的时候,weak会将指针置为nil,assign不会,导致野指针,所以当delegate被释放的时候,需要手动将指针置为nil
5.atomic为什么不能保证线程安全,用atomic修饰NSMutableArray是线程安全的吗
atomic是原子级线程安全,原子级的意思是一个整体,就是对这个对象整体的get和set方法进行了加锁,但是修改对象中包含的对象不能实现线程安全,如果用atomic修饰数组,修改数组中的对象不是线程安全的
6.消息机制,消息转发
7.启动时间多长,做过什么优化
8.项目中用到过锁吗?有哪几种锁
iOS中锁分为两种:
1.互斥锁: 互斥锁在被持有的状态下,其他资源申请者只能进入休眠状态,当锁被释放后,CPU会唤醒资源申请者,然后获得锁并访问资源。
2.自旋锁: 自旋锁不会引起其他调用者休眠,而是让其他调用者自旋,不停的循环访问自旋锁导致调用者处于busy-wait(忙等状态),直到自旋锁的保持者释放锁。
image.png
效率如下图
image.png
网友评论