2023笔记
-
GCD同步没有开启新线程的能力
-
dispatch_sync() 造成死锁的条件是:dispatch_sync的当前执行队列与提交block执行的目标队列相同时将造成死锁。
-
使用sync函数往当前串行队列中添加任务,会卡住当前的串行队列(产生死锁)
-
并发队列可以一下子处理多个任务,但是并不是一定会开新线程,并发队列不需要向串行队列一样一个一个处理任务
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MVJcEhgw-1690702044184)(2023%E7%AC%94%E8%AE%B0%2065b04df55b854816ba2946b5184a64b5/Untitled.png)]
-
各种组合
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cp7Rrb4T-1690702044185)(2023%E7%AC%94%E8%AE%B0%2065b04df55b854816ba2946b5184a64b5/Untitled%201.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AQLOwrQN-1690702044185)(2023%E7%AC%94%E8%AE%B0%2065b04df55b854816ba2946b5184a64b5/Untitled%202.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p00KvIO8-1690702044185)(2023%E7%AC%94%E8%AE%B0%2065b04df55b854816ba2946b5184a64b5/Untitled%203.png)]
-
dispatch_after
方法并不是在指定时间之后才开始执行处理,而是在指定时间之后将任务追加到主队列中 -
Flutter感觉语法和SwiftUI差不多,和Reactnative区别在于,React Native最后还是使用原生控件去加载视图,比如UILabel,而Flutter是有自己的一套渲染机制,不用映射到原生控件,效率高。有热重载,毫秒级别。多平台支持web, macos, iOS, Android等。
-
新闻和评论界面实现方式,优化
实现方式有三种
-
下图是scrollViewInset和TableViewHeader方式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WnSkA6sL-1690702044186)(2023%E7%AC%94%E8%AE%B0%2065b04df55b854816ba2946b5184a64b5/Untitled%204.png)]
-
另外是使用scrollview方式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HRCpeZ6k-1690702044186)(2023%E7%AC%94%E8%AE%B0%2065b04df55b854816ba2946b5184a64b5/Untitled%205.png)]
优化有以下几点
- WKWebView复用
- WebView中图片视频GIF图等使用原生控件加载,这样会减轻WebView加载压力,提高速度
- WebView中非文字的控件全部用原生控件加载,并且要复用,提高加载速度
-
-
类似微信朋友圈视图的布局和优化思路
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rTOsdASm-1690702044187)(2023%E7%AC%94%E8%AE%B0%2065b04df55b854816ba2946b5184a64b5/Untitled%206.png)]
-
OC 消息传递机制
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lYVsW4Mr-1690702044187)(2023%E7%AC%94%E8%AE%B0%2065b04df55b854816ba2946b5184a64b5/Untitled%207.png)]
-
weak的原理
weak不会引用计数增加1的原理是,runtime维护了一个弱引用表,有weak的话就往里面增加一个hash键值对,当对象dealloc的时候,会把弱引用表清空,指针指向nil
-
讲讲runloop
个人理解,是一个循环,保证线程能够一直运行不退出,也会休眠,因为休眠后不可能自己重新恢复激活,所以需要有其他对象触发激活。
NSTimer是放到runloop中的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q7WtTHIp-1690702044187)(2023%E7%AC%94%E8%AE%B0%2065b04df55b854816ba2946b5184a64b5/Untitled%208.png)]
-
GCD如何实现NSOperationQueue的特性
最大并发数:用信号量控制最大数,如果并发数设置为4,那信号量为3,执行完了发送信号量不然就等着。
线程依赖:使用调度组dispatch_group_create和GCD中的栅栏和wait也能实现同样的效果。 -
数据持久化存储方案有哪些?
- plist 文件(属性列表)
- UserDefaults(偏好设置)
- NSKeyedArchiver(归档)
- keychain
- SQLite
- CoreData
-
组件化的理解
首先是学习的阿里的BeeHive框架,组件化的运用场景是项目比较大,各个模块比较多,为了解除各个模块之间的耦合,使用入口和实现方式,如果依赖其他模块,但是还没开发好,可以只依赖这个模块的入口,入口代码通过category增加Mediator分发者的方法,Mediator通过performSelector + NSInvocation动态调用方法,如果没有实现方法,则返回nil。这样可以让每个模块开发不会受其他模块的影响,耦合程度降低。
-
tableview优化方案
- 重用机制
- 使用tableViewCell的估算高度,这样会减少调用heightForCell的频率
- 提前缓存行高
- 减少cell视图的复杂度
- 减少离屏渲染
-
检测卡顿的方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a5ukOZE4-1690702044187)(2023%E7%AC%94%E8%AE%B0%2065b04df55b854816ba2946b5184a64b5/Untitled%209.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I1N2W3Js-1690702044188)(2023%E7%AC%94%E8%AE%B0%2065b04df55b854816ba2946b5184a64b5/Untitled%2010.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c2QYCEy8-1690702044188)(2023%E7%AC%94%E8%AE%B0%2065b04df55b854816ba2946b5184a64b5/Untitled%2011.png)]