面试题总结

2022-05-10  本文已影响0人  lmao94
fmdb 线程死锁的问题

fmdb在插入多条数据的时候,放在主线程会阻塞线程,所以应该放在子线程中执行,于是有了databasequeue来保证线程安全,databasequeue本质上是将加入的任务放入一个同步串行队列中使任务顺序执行,要注意在queue调用数据库的时候不要嵌套使用

cocoahttpserver 怎么用,为什么

在app端建立socket服务监听,将文件写入沙箱
下载github上三方库,引入对应文件,拷贝appdelegate里面的代码就成了

__block 为什么能修改局部变量
非对象的变量

自动变量的值是被copy进了block,在block中只能在block里面访问,不会改变值
带__block的自动变量和静态变量是直接访问地址,所以可以被修改

对象

声明为__block的对象会被捕获到block中,结构体里会有foward指针指向原对象,在block内部会被强引用,所以可以修改

kvo 需要注意什么
  • 必须用set/get,也就是点语法或者kvc进行赋值才能被观察到,如果是使用下划线,也就是直接调用成员变量进行复制修改操作,不会被检测到
  • 用完之后需要移除
  • 如果是在父类或者其他类也做了kvo监听,可以通过context(字符串)进行区分
  • 多次移除会崩溃
  • 如果没有相应kvo方法,可以检查父类是否截断了kvo方法
category 为什么不能添加属性

category是运行时决议的。
声明属性,只会将属性添加到属性列表,但是并不会生成相应的属性,也没有实现stetter和getter方法。

weak strong copy 区别
  • weak在引用对象被释放的时候会自动被设置为nil。
  • strong被引用计数+1,持有对象销毁则计数-1,为0内存回收。
  • copy不影响原对象引用计数,在被引用时计数-1,然后创建新对象计数+1。
assign 声明对象会有什么问题
  • 对象一般在堆区,assign修饰的对象在释放之后,地址依旧保存,会造成野指针。在后续的开发中,如果分配到这个内存区域,会造成程序崩溃
  • 基本数据类型在栈区,系统自动管理,在释放之后,系统自动回收内存,因此不会造成野指针错误
tableview 优化
  • 使用不透明视图
  • cell重用,不要重复创建一样的cell
  • 减少视图数目,可以使用drawrect绘制,尽量少用阴影,圆角,透明度等效果
  • 用子线程预加载数据,子线程数目不要超过两个
runloop的几个mode
  • defaultmode 应用平时的状态,空闲状态
  • trackingrunmode 当scrollview滚动时runloop的状态
  • commonmode 综合,不是一个真正的mode,占位用的,包含default和trackingrun两个mode
  • initializationrunmode应用启动的mode,启动完成之后就不再使用
    eventreceiverunloopmode接受系统事件的内部mode,通常用不着
KVO原理

基于runtime机制实现,运用isa-swizzling技术,将两个对象的isa指针互相调换。
\color{red}{实现:}当某个类的属性对象第一次被观察时,系统会在运行时动态创建一个该类的子类,重写该类的setter方法,在赋值操作前后调用willChangeValueForKey和didChangeValueForKey方法,然后调用observer的observerValueForKeyPath方法

字典的实现,结构

本质上也是一个hash表实现的存储结构,用key值计算出一个位置,然后将键值以链表的形式对存入

weak原理
  • runtime维护着一个weak表即hash表,用于存储指向对象的weak指针
  • Weak表是Hash表,Key是所指对象的地址,Value是Weak指针地址的数组
  • 以对象的地址作为key,去找weak指针
  • 触发调用arr_clear_deallocating 函数 ,根据对象的地址将所有weak指针地址的数组,遍历数组把其中的数据置为nil。
数据库怎么存图片

将图片转换成二进制数据,以blob对象的形式存入数据库

category的作用?
  • 添加方法
  • 多继承、公开私有方法
  • 降低耦合性、减少代码量
上一篇下一篇

猜你喜欢

热点阅读