# 面试学问

1. 技术面试问你遇到的难题是什么，如何解决的？
在考察你的技术边界

2. 至今遇到过的比较麻烦的技术问题？

- 在App首次安装启动的时候，商品列表快速滑动到底部，再向上慢慢滑动，看到商品view上面的文字和价格都显示正确，但是图片显示是有问题的。想到的是由于SDWebImageView图片问题导致的，因为再快速滑动的时候，图片开启了下载任务，但是异步下载的，cell也在复用池了，所以当你停止滑动看到商品view的时候正是之前的其他的图片任务下载结束，这样子再去响应给view设置图片就会造成当前的显示的图片并不是当前model对应的图片。知道问题的原因那么事情就好解决啦。思路就是如何区分当前下载好的cell是不是当前正在现实的cell。所以思路有2个。
  - 自定义的 cell 里面可以拿到 model.imageUrl，那么当下载图片完成的时候可以在 block 里面去判断回调完成里面的 url 和 model.imageUrl 是否一致，一致的话就设置图片，否则不设置
  - 在 cellForRow 里面去通过 indexPathForCell: 这个 api 拿到 indexPath，然后根据拿到的复用的 indexPath.row 再和当前现实的 indexPath.row 做比较，如果一致则设置图片，不一致则不设置图片





- 代码在编译的时候一直报出问题：某个pod的某个头文件file not found。最后排查问题发现工程中存在2个同名的 Framework，一个版本新、一个版本旧。主工程中链接到旧工程中了，所以一直找不到文件。


## 网络篇

- [App网络优化](https://blog.cnbang.net/tech/3531/)
- [IP 直连](https://www.jianshu.com/p/63a94cb46cd20。SNI：Server Name Indication。一个服务器的 IP 可能对应多个域名，也就说可能有多个 HTTPS 证书，如果在请求的时候不指定具体哪个的证书，服务器可能会返回错误的证书
- 多路复用
  

## 系统优化

- [移动端监控体系](https://www.jianshu.com/p/8123fc17fe0e)
- [启动时间优化](http://yulingtianxia.com/blog/2016/10/30/Optimizing-App-Startup-Time/)

稳定性、常见的稳定排查、crash率，监控、提升工程效率的工具（性能，效率，安全，成本，体验）、电量优化、看大图体验


## 思考

组件：重用、解耦。模块：封装、隔离。

架构中，模块复用的第一要求便是代码的功能组件化。组件化意味着拥有独立功能的代码从系统中进行抽象并剥离，再以“插件”的形式插回原有系统中。这样剥离出来的功能组件，便可以供其他APP使用，从而降低系统中模块与模块之间的耦合性；也同时提高了APP之间代码的复用性


借助于 Redux 的方式，将 MVC 更改为 MVCS（s为store）。MVC 中的 view 做到无状态，完全依赖于 Store 中返回的各种状态信息。

组件化之后分为技术组件、公用业务组件、每个业务线都是单独组件。通过把不同功能的组件代码拆分到不同的 pod 里，实现了业务线仅依赖于公共就可以迭代开发。改善了功能开发和协同版本。

流量过大，和服务器交互过多，采用 protoBuf 作为数据载体，有效减小流量消耗。

热修复：JavascriptCore + Aspects



组件化、模块化、热修复、RN 兜底后架构模式：
![App架构](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/2019-07-05-App-structure.jpeg)



- Runtime
- 网络
- Hybrid
- RN、Weex
- JavascoriptCore 如何传递 Block