OC
- runtime
- method_swizzled使用和原理:方法的调用实际上是消息发送,一个对象收到消息之后会在类的方法列表中(或者缓存列表)中寻找该消息对应的method,swizzled就是修改方法列表中的元素,使得method中的imp指针指向交换后的实现,从而达到方法交换的目的。
- category方法覆盖关系,为什么不允许新增实例变量
- load和initialize:load方法在文件被装载时调用,线程安全,只会被调用一次,一般用于方法交换。initialize方法会在首次给该类发送消息时调用,一般可以用于为不方便在编译期赋值的静态变量赋值。
- kvo
- runloop
- 与多线程的关系:线程与runloop是一一对应的关系,一个线程最多拥有一个runloop(在非主线程,只有执行了获取函数才会创建runloop),并且runloop只能在所在的线程获取(mainRunloop除外)
- 如何获取fps:由于CADisplayLink与屏幕刷新率一致(60fps),所以将它加入到mainRunloop中,通过计算两次执行的间隔时间即可得到fps。
- 启动优化,记录+load到第二个main runloop时间间隔计算启动时间。优化启动链路,使用task区分启动任务,实现任务可配置
- 监测卡顿
- Block
- 对象捕获:当block内引用外部变量时,会捕获外部变量,这个捕获会进行复制操作,产生一个新的副本
- 堆栈转移:当block的执行需要超出其所在方法的作用域时,就需要将其从栈拷贝到堆中
- 保留环的产生原理和解决方案:block被A引用,block内部又引用A就会产生保留环。用__weak来解决
- 自动检测保留环
- Auto release pool
- 原理、实现:通过在主线程的runloop中注册两个通知,一个是刚刚进入runloop,此时会创建一个自动释放池,该操作的优先级最高,会在所有其他回调之前。另一个是runloop即将休眠或退出的通知,此时会释放自动释放池。因此主线程的代码通常会被自动释放池很好的环绕,而不必担心内存泄漏。
- 对象的内存结构
- imp:函数指针,存储方法的实现的地址
- isa:对象的isa指向类,类的指向元类,元类的指向超类,root类的元类指向root类
- 判断两个对象是否相等
- 什么情况会发生bad_access的情况
- 如何实现僵尸对象捕获
- 如何实现bad_access捕获
- 什么时候会发生内存泄露:一个对象的引用计数无法归零,不使用的堆内存无法释放
- weak和assign的实现
- 对象的存储位置:堆,指针的位置:栈
UI - 响应链
- 响应链的查找过程:系统通过如下过程确定是哪里发生了touch事件AppDelegate->UIApplication->Window->Controller->View,hitTest方法会遍历整个视图层级,对每个子View调用pointInside方法来决定最后由哪个视图来响应事件。当pointInside返回true时,继续调用子View的该方法,直到没有子View或该方法返回false结束。最后一个返回true的view就成为了第一响应者,也就是touch事件生效的view。响应者脸则是该过程的逆向。
- 如何扩大按钮的响应区域:重写 pointInside:withEvent方法
- layoutsubview和drawrect的调用时机:layoutSubview会在修改了视图大小、位置、添加了子view、设备旋转以及更新约束时,或者调用了setNeedsLayout方法后,在下一次update cycle调用,或者在调用了layoutIfNeeded方法后立即调用(但是就像方法名描述的,如果在调用这个方法时没有修改view使得系统将该View标记为需要重新布局,则layoutSubview不会被调用,另一种情况是在一次runloop中连续调用了两次layoutIfNeeded方法,那么layoutSubview也只会执行一次);drawrect方法会在视图的内容变化后被调用,调用逻辑与layoutSubview相似
- cpu render和gpurender
- 自定义控件
- 贝塞尔曲线使用
- 屏幕旋转的处理
- 视频横屏
- 个别控制器横屏
- 自动布局的性能瓶颈
- tableview优化
- 图片展示优化,预渲染
- 实现一个边移动变旋转的动画:组动画
- UIWindow层级关系,level:UIWindow根据level来决定显示关系,即使一个window是先添加的,若他的level比后添加的要高,那么他也是处于层级更靠前的位置
- UItouch事件传递:自视图顶层向下,直到AppDelegate,例外的是当向view添加手势时,手势的响应级别更高。
- iOS从启动到展现的生命周期函数:冷启动:- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions-> - (void)applicationDidBecomeActive:(UIApplication *)application;热启动(从后台进入前台): - (void)applicationWillEnterForeground:(UIApplication *)application-> - (void)applicationDidBecomeActive:(UIApplication *)application
- 如何做一个全屏动画而不影响事件响应:1、用响应链的思路,让hitTest返回nil,或者pointInSide返回false,或者userInteractionEnable设为NO。2、用layer实现
- 动画过程中响应触摸事件:动画移动过程中可以通过 presentationLayer获得layer真实的位置,在父视图中检测点击位置来响应。
多线程 - 常见的几种队列方式:串行队列和并发队列
- gcd队列的执行方式:同步和异步
- 线程锁死:在串行队列中同步任务
- 多任务同步的方式:dispatch_sync和NSOperation Queue
- 当多个operation添加到OperationQueue中时,默认是异步并发执行的,可以设置maxConcurrentOperationCount = 1来实现同步
- 任务抽象
- gcd原理
- 线程安全:信号量、锁
- 组队列
- 控制最大并发数:NSOperationQueue 设置. maxConcurrentOperationCount
- 在dealloc中使用after,中访问self有什么问题:self已经释放,会空指针异常
- 任务依赖:NSOperation可以通过 addDependency方法添加依赖
- 空闲时处理:
- qualityOfService:
- NSQualityOfServiceUserInteractive:用户交互级别:最高级别,通常用于响应用户操作的UI处理,如将图像绘制到屏幕上;
2. NSQualityOfServiceUserInitiated:用户发起级别:由用户发起的仅次于UI的任务,用户希望立即响应并在此任务完成后进行下一步操作。如远程内容载入;
3. NSQualityOfServiceUtility:工具级别:由用户或自动发起,不必要立即响应,不阻止用户交互。通常以一个可见的进度条来标示进度,例如预加载内容、上传或大量文件操作(如媒体导入)。
4. NSQualityOfServiceBackground:后台级别:通常不是由用户发起、用户不可见的。例如备份、索引、数据同步等。
5. NSQualityOfServiceDefault:将从其他来源推测QoS,如果无法推断,将使用 UserInitiated 到 Utility中的一个。- 此处需要注意另一个属性 queuePriority,该属性决定的是在NSOperationQueue中operation的执行顺序
- NSOperation使用
网络 - http协议结构
- 优化策略
- 链路优化:HTTPDNS
- 压缩body:Protobuf、压缩算法(Brotli、Z-standard)
- keep alive、多路复用(http/1.2)
- 复用长链接
- dns映射,动态选路
- 合并请求
- IP直连
- 内链,外链,路由
- socket
- 用nsurlconnection和nsurlsession写请求
设计 - 高内聚,低耦合
- 参数灵活性
3. 设计通用性
4. mvvm
5. 组件化
6. crash监测,记录,上报
算法
1. 排序
2. 深度和广度
3. 写一个检测ip是否有效的算法
1. 字符串两端空格过滤
2. 字符串中间含有空格为非法
3. ip子段开头为0为非法(01.2.3.4)
4. 数组任意两个数求和,要求和为给定的值,进一步,n个数求和满足条件
5. 最大子列和
6. 查找字符串中唯一且下标最小的字符
7. 整形转换,1234>4321
8. 加密算法了解
自己实现ORM 各种排序
基础
堆和栈的概念,区别
AFN的底层实现 UIconection ,session 区别,下载存磁盘,内存, 上传 基本形式文件,data
HTTP 和HTTPS 的区别
ssl 加密 i love you 所有字母都加4
i love you = 38rrjlsjdf83fjlsjf 伴随着密钥
NSUrlSession 和 NSUrlConnection 的区别
pthread c 管子是队列 球线程 管子有没有洞说明队列是不是可以开异步线程
串行没洞, 并行队列 有洞
nsthread
gcd
nsoprition
UI动画 关键帧 基本 转场 lottie动画 不掉帧不卡顿 硬件加速 可以正放倒放 各个点放 json方式绘制
WKWebView 和 UIWebView的区别 优点
响应式编程 跨类通信 发生事情可以 可以加入队列 某个类来订阅 订阅的类会收到发生事情的信息
组件化 大而稳定的情况下使用 组件化 为了避免无意修改造成的问题 对网络 图像 处理 刷新等 各种稳定而不常更改的需求 进行打包
github发布框架
缺点: 如果有小的API改动也需要重新打包 更新组件版本
运行时 交换方法 load中调用 应用场景 : 发匿名消息 调用某个方法
KVO 创建一个一样的子类 然后更改或者欺骗当前类的isa指针 指向子类对象
block 代理 函数指针 (函数入口地址)
网络:
SDWEBImage 同样的URL 如果后台更新了图片 url没变 前端 怎么知道 根据请求头中有content属性会记录是否是新的请求。
AutoLayout 优先级 布局
openGL: 图片识别 磨砂 美颜 GPUImage
全景图像 openGL ES 2.0 3.0
图像处理:
openCV 取色
类的结构:
RunLoop :
是什么 ? 是一个单例对象 全局唯一 只能创建一次
NSTimer 和 runloop 的区别
runloop 比 timer 大 , 当timer 运行的时候 runloop 可能去做别的事情 然后导致timer 实时性差 timer 在runloop 忙得时候有可能漏 调
timer 被添加到runloop 中有几个模式可以选择 default 默认模式, track UI追踪模式 , commen 兼容 模式 如果选择 非兼容模式遇到scrollView滚动的时可能导致timer 停止 所以解决方案 选择兼容模式即可。
uitableView优化
原因:
卡顿的点:
cell 太大 层级太多 View的创建和Frame的变化 赋值等会耗时 , reloadData cellForRow 做frame变化的处理
网友评论