面试
一、面一
1、常用修饰符:
strong 强引用
Weak 循环引用
copy 修饰
Assign 基本数据类型
基本使用可以,互相切换使用可能造成的问题,不清楚。
2、内存方面
引用计数-散列表
小对象-有了解
3、分类原理
知道部分,解答的跟网络上的差不多,不准确。
4、启动优化(有了解,但是深度不够)
检测方向:工具+xcode 环境变量 (知道但是不知道具体变量名)
优化方向:pre-main和main函数之后
知道优化+load 但是不知道+load的具体作用。
知道优化动态库,但是不知道动态库不能合并。
知道干掉无用类,但是没说具体的检测方法。
知道二进制重排(hook 和 插装),原理知道一二,但是不知道具体如何做的。
5、对runtime有一定了解。
二、面二
Property本质。协议中使用property,不完全正确
weak/assign,尚可
dispatch_once原理不清楚
列表优化,尚可
约束:抗压缩、抗拉伸
load/initialize,有错误
多线程使用,只熟悉GCD。
锁不熟悉
二进制重排不熟悉
面三、
底层原理:
1、类的加载
加载时机,回到在main之前做的。回答错误。
+load方法,只用过hook,但是不知道其他作用。
2、消息转发机制
- 能知道快速查找,慢速查找,然后三次转发。但是具体的快速怎么查找,慢速怎么查找就不清楚了。
3、类结构
- 知道一些很久以前的结构。
业务使用:
1、常用修饰符,weak、strong、copy、assign使用和区别,回答的可以。集合类型可以区分何时使用copy和strong,知道用assign修饰对象会引发野指针。
2、frame 和bounds区别,坐标系不同。
3、block种类和使用注意事项
知道循环引用,并用weak和strong搭配使用解决。
知道三种类型,但是不太清楚没中类型的辨别。
知道修改外部变量,全局或者静态直接修改,局部需要加__block.远离了解一些,但不深入
4、timer的使用和注意方式
- 知道会造成内存泄漏,知道原因是RunLoop引用造成的,解决方案知道,但是不清楚是怎么做的。
5、分类的使用和注意事项
知道分类方法的调用顺序,但是不准确。
知道方法可以通过关联对象的方式添加属性。
知道不能添加成员变量,是因为成员变量决定类分配内存的大小,动态改变会造成内存的错乱,这点理解的很好
面四
1结合runloop的状态来做启动优化 怎么从这个run loop的这个状态去监测他有没有卡顿 或者说他哪些东西占用时间太长。
加参数,真机上运行的话,它会把你每个阶段的那个耗时都给打印出来,run loop可以加一个observer,就是监听一下run loop的状态。
2 多线程
pthread
NSThread 可以查询线程状态、是否是主线程
Operation 依赖 / 最大并发数
GCD 方法多
DispatchQueue
3KVO实现
isa_swizzing
4动画的阶段,卡顿的原因,这些动画实际上有哪些优化的点
CPU负担过重,比如说计算这个frame或者是计算它的位置,或者是开辟空间,然后gpu去绘制它的那个,要么就阴影啊或者圆角啊,这些就是反正有一个时间耗长。
5.在iOS中,一张图片从磁盘加载到屏幕上的过程和可能的耗时
6.table view列表有哪些东西常见的耗时
然后在数据转模型的过程中,就把这个高度给计算好,然后这样的话,在方法里面直接把计算好的那个就是我们的行返回。
7.组件间的通信
8.列表的视频播放
9.H5和NA之间的通信方式
面五、
1、KVO
2、H5与NA之间的通信方式:不清楚,使用统一封装
3、OC和swift混合开发:介绍了swift和oc的差异,但是swift没有持续关注
4、多线程方面:使用 &了解的比较少,不清楚锁
5、App提交审核:不了解审核不通过的原因和解决方案
6、新技术适配:做过一些比较久了,现在的新的没太去了解
Strong:强引用,自定义一些属性,UI元素等,字符串可变用
Weak:弱引用,代理、Block场景解决循环引用
Copy:不可变字符串,不可变为啥用copy?Block
.包体积优化
1.二进制文件优化:无用类、方法、动态库、APPCode扫描删减
2.资源文件优化:图片无用资源删减、图片优化
单例。有差错
多线程。能说出GCD/NSOperation基本使用方式、差别;任务取消有偏差
启动优化。主要思路清晰:pre-main/post-main。二进制重排、page fault
组件化。有了解常规方案,私有Pod
load/initialize。能说明调用顺序及使用场景,编译顺序调整有偏差。
1.iOS属性的修饰符有哪些?怎么使用的?
strong:强引用
weak:弱引用
Assin:基本数据类型
readOnly:
原子性:默认原子性,一般使用非原子性
2.什么是循环引用?循环场景有哪些?怎么处理?不会造成循环引用的场景?
双重强引用
协议使用weak避免
Block是使用 weakSelf
NSTimer:
打破强引用环
GCD
UIView
AFN
SD
Masony
3.包体积优化
图片:无损压缩
三方库
Xcode工具检测
4.多线程编程技术有哪些?
GCD、NSOperation 常用
NSThread不常用
NSOperation:设置优先级、设置最大并发数、管理线程的生命周期
GCD:队列、栅栏函数、延迟执行
5.H5和NA之间的通信方式?
1.直接NA通讯
2.通过三方JSBridge
大图下载发生了OOM。如何排查与优化(降采样)~~dispatch_once是线程安全的吗?它的实现原理是什么
用copy修饰可变数组会有什么问题说说retain、copy、assign、weak关键字的理解(回答OK)
讲一下atomic的实现机制;为什么不能保证绝对的线程安全(最好可以结合场景来说)?(回答OK)
weak修饰的对象在被释放的时候自动置为nil的原理(回答OK)
NSTimer和CADisplayLink的比较 ?(回答OK)
说说几种几种多线程方案以及它们的对比(回答OK)
性能优化相关:启动优化与卡顿优化(回答OK)
静态链接了解么?静态库和动态库的区别?
谈谈对线程和进程的理解;chrome每一个tab窗口是线程还是进程;
网络分层及每一层的作用,http协议在一层,他是基于什么协议实现的;
tcp是位于哪一层;tcp和udp区别;tcp握手有几次,可以可以精简次数;
面向对象和面向过程语言区别;面向对象语言三个特性及理解;
常见的数据有哪些。栈和队列区别,如何用队列实现栈~~
一.什么是线程和进程
进程是操作系统资源分配的基本单位
线程是CPU调度的基本单位
传输层协议
TCP:协议头、可靠、拥塞控制、流量控制、建立连接。
UDP:不可靠、数据包形式传输、实现广播。
TCP场景:需要可靠连接的场景
UDP:流式场景、视频会议
三、3次握手的必要性
1.客户端具有发送能力、服务端具有接收能力
2.服务端具有发送能力、客户端具有接受能力
3.服务端不知道客户端具有接收能力
KVO的实现原理 ?如何手动触发KVO ?直接修改成员变量会触发KVO吗?(不了解)
initialize和load方法的区别(不了解)
异步执行(async)一定会开启新的线程吗(不了解)
封装了很多第三方框架。问题:封装在什么场景下使用什么设计模式:常见的设计模式。(不了解)
简历里面提到优化 SDWebImage 导致的内存暴涨问题 ? 具体说说。为什么会出现。引申出:sdwebImage的几个问题:
(1). SD的缓存机制(回答OK,双缓存机制)。
(2). SD如何解决快速滑动,多张图片加载错乱问题。(不了解)
(3). TableView滑动下的下载处理
项目里面有做过iap。iap遇到过哪些问题 ,使用OC还是swift? 如何进行票据校验的。 如果后台需要将票据都存储起来做数据分析。你这边会如何设计。(IAP不知道是什么,就是做了简单的流程,续订的不太了解)。
图片加载过程(不了解)
什么是离屏渲染? 是不是设置圆角就一定会触发离屏渲染?(不知道什么是离屏渲染)
算法:
查找两个子视图的公共父视图(不会)
多任务按顺序依赖执行有哪些方式实现
常见的排序算法及原理
Charles 抓包原理
设计一个图片下载器 (下载、缓存)、LRU实现原理快排原理、最好最差时间复杂度、 最差情况优化最长覆盖子串说出思路自定义类如何实现copy日志回捞 使用Hook简单打点Crash治理 增加了下页面路径等手段