常用面试题

1,请做一个简单的自我介绍

面试官,你好,我叫XXX,我是2015年计算机专业 本科毕业,毕业之后一直从事iOS开发工作,主要使用的语言是OC。
在过往的工作中,担任过北京红云融通技术有限公司iOS开发,我们公司的主要产品是红云会议以及sdk,这是一款类似于腾讯会议的产品,我的主要工作是,主导红云会议APP和SDK迭代开发已经上架发布任务,期间优化了千人入会的会议入会场景,从入会40+s 优化到2s,修复了现有版本中的内存泄漏,解决程序异常闪退问题。
此前在成都御顺投资参与重构CRM系统,这是 是款姐内部员工使用的一款客户管理 app,完成了多分公司不同功能的业务场景。
在之前。就职于成都博智维讯技术有限公司 期间独立完成水井坊公司的展销类APP英雄汇开发任务,从开发到上架都是独立完成的,再之前还参与过南京SFA洋和项目,以及1919配送端的项目开发,集成百度地图导航模块,完成了到目的地的路径规划功能。
另外在工作中我也参与过安卓,前端,flutter的部分页面的开发工作,对其他语言有一定的了解,期待能在贵公司发挥我的专业技能,创造价值。

2.你在项目中遇到过什么比较难的问题,怎么解决的

当时我们做视频会议SDK时,碰到一个挺头疼的问题:App开千人大会的时候,入会特别慢(要十几秒),还动不动就闪退。用低配iPhone的用户经常抱怨,一进会议手机就发烫,甚至直接卡死。
后来经过排查我发现主要问题是:入会时一次性加载太多东西,而且进退会之后内存没有释放完全,造成内存暴涨APP闪退。
最终的解决方案是,修复了页面加载机制,原来是按照入会人数创建视图,后面创建了一个试图控制的类,用一个数组来存储一个对象,实现按需加载,最多只创建6个试图,将入会时间缩短到2s内,另外关于内存泄露的问题,根据xcode 工具,发现是很多循环引用的错误,采用weak strong关键字解决内存泄漏问题,避免的APP的闪退

3,你觉得你的优势是什么

我认为自己的优势有几点,
第一,因为开发ios已经多年,遇到过很多性能优化和内存泄漏方面的问题,所以对于这类问题的定位和解决有经验。
第二,常规任务完成迅速,在界面搭建上,写过很多纯代码以及xib的操作,能够快速响应开发任务并且快速交付。
第三,独立完成过多个项目,熟悉ios从开发到上架的全部流程
第四,乐于接受新事务,能够利用ai工具,例如gpt deepseek寻找解决问题的办法
第五,对其他语言也有所接触,能够快速上手开发

4,你有研究过第三方库的源码吗? 有什么收获

我读过一些第三方库的源码,印象比较深刻的是SDWebImage这个库
其中印象深刻的是缓存管理这块,iOS的缓存一般包括 内存缓存和硬盘缓存两方面
SD为减少网络流量,下载完图片后存储到本地,下次再获取同一张图片时,直接从本地获取,提升用户体验,能快速从本地获取呈现给用户。

SDWebImage的图片缓存实现主要基于内存和磁盘两级缓存,结合高效的资源管理策略。具体实现可以分为以下几个关键点:

内存缓存(快速响应)

使用NSCache存储最近访问的图片,它会在内存不足时自动清理低频数据,避免应用被系统终止。
通过URL生成唯一的哈希键(如MD5处理),以O(1)时间复杂度快速查找图片,类似于字典的结构。

磁盘缓存(持久化存储)

图片以文件形式存储在Library/Caches目录,文件名通过URL哈希处理,避免命名冲突。
根据图片格式(如JPEG/PNG)选择最优压缩方式存储,减少磁盘占用。

多级缓存策略(高效查询)
  • 查询流程:先查内存缓存 → 未命中则异步查磁盘 → 仍无数据才触发网络下载。
  • 淘汰机制:
    • 内存缓存基于NSCache的LRU(最近最少使用)策略自动清理。
    • 磁盘缓存默认7天有效期,并限制最大缓存容量,定期清理旧文件。
      防重复下载与线程安全

使用URLCallbacks字典记录所有进行中的下载任务。当多个请求同一URL时,通过回调数组复用下载任务,避免重复网络请求。
通过GCD的屏障队列(barrierQueue)保证对URLCallbacks的线程安全读写,确保多线程环境下不会出现竞争。

性能优化细节

后台解码:下载完成后在子线程解码图片,避免主线程卡顿。
异步存储:磁盘缓存写入通过串行队列异步执行,不阻塞主线程。
灵活的缓存控制

通过SDWebImageOptions参数支持多种场景:

SDWebImageRefreshCached:强制跳过缓存重新下载(适用于图片可能更新的场景)。
SDWebImageCacheMemoryOnly:仅使用内存缓存(临时数据避免磁盘占用)。
SDWebImageQueryDataWhenInMemory:内存命中时仍校验数据有效性(如ETag)。

5,你对性能优化有什么想法

关于性能优化,可以从5个方面入手,

  • cpu过载
    复杂的计算,大量的数据处理,同步任务的阻塞主线程造成过载,我们可以使用缓存和预处理等方式减少不必要的计算
  • GPU 过载
    高复杂的图形操作,纹理资源过多,过度绘制等会造成GPU过载
    我们需要避免过度绘制,确保UI层次结构简单,减少复杂的图形操作,优化图形资源的使用以及使用合适的图形框架和技术,比如metal和core aniamation ,提高渲染效率
  • 内存压力
    过多的内存分配,内存的释放不及时,以及资源的泄漏等会造成内存压力,我们可以通过减少内存的分配,及时释放资源,使用autoreleasepool 控制内存使用,避免内存泄漏,确保图形资源的的有效管理,避免不必要纹理和缓存
  • 主线程的阻塞
    长时间的同步任务,网络请求,文件的I/O 等造成过载主线程的阻塞,
    我们要避免在主线程进行同步操作,比如网络请求,文件的IO等,将主线程任务移动到后台线程,使用GCD是处理异步任务等
  • 过度绘制
    复杂的视图层级,冗余的UI元素等,错误的参数导致的冲突等会造成过度绘制,我们需要确保参数的合理,避免动画时间过长或过短,避免动画冲突,确保动画的顺序和逻辑,使用合适的动画工具,如core Animaiton uikit 动画等,确保动画流畅
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容