OC语法
1. Block是如何实现的?Block对应的数据结构是什么样子的?__block的作用是什么?它对应的数据结构又是什么样子的?
- block结构是一个结构体
struct __main_block_impl_0 { struct __block_impl impl; struct __main_block_desc_0* Desc; __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int flags=0) { impl.isa = &_NSConcreteStackBlock; impl.Flags = flags; impl.FuncPtr = fp; Desc = desc; } };
- block的具体实现保存在impl的FuncPtr字段中
- block中的变量捕获:
(1)自动变量保存在block结构体中,通过block结构体获取自动变量的值。
(2)局部静态变量的指针保存在block结构体中,通过block结构体获取到变量指针最后获取变量的值。
(3)全局变量可以直接访问。
(4)全局静态变量可以直接访问。 - block的类型:
(1)没有捕获参数时是NSGlobalBlock类型
(2)捕获了参数,但是block没有被引用时是NSStackBlock
(3)当block作为返回值时,当block被赋值给strong指针时,当block作为Cocoa API方法参数时,当block作为GCD方法参数时,是NSMallocBlock - 在block被copy时,会通过__main_block_copy_0和__main_block_dispose_0函数对捕获的参数进行内存管理。
- 当参数使用__block修饰时,捕获的参数会被包在__Block_byref_object_0结构体中,结构体中__forwarding字段会将栈block中byref结构体指向堆block中的byref结构体,使block内外的变量统一,这样就可以在变量被copy到堆上之后还是能修改栈上的变量。
2. stringWithFormat中%@的占位原理
3. 已知变量 age是NSInteger类型,下面这段代码能编译通过,请问在运行时会不会崩溃?请从原理上解释为什么?
NSString *str = [NSString stringWithFormat:@"%@",1];
4. GCD中的Block是在堆上还是栈上?
堆上。可以通过block的isa指针确认。
5. NSCoding协议是干什么用的?
6. KVO的实现原理。
7. NSOperation有哪些特性比着GCD有哪些优点,它有哪些API?
8. NSNotificaiton是同步还是异步的,如果发通知时在子线程,接收在哪个线程?
9. 符号绑定原理。
10. performSelecter与runloop有什么关系
通过performSelecter调用方法时,会创建一个timer,将这个timer添加到runloop中执行。当在子线程中调用performSelecter时需要注意runloop是不是跑起来了。
11. 一个NSObject对象占用多少内存?
需要理解OC对象在内存中有哪些内容,是怎样分布的。
OC对象的底层是基于C/C++的结构体来实现的。
利用下面的命令将OC代码编译为C++代码(xx为文件名)
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc xx.m -o xx.cpp
"-sdk"指定平台
"-arch"指定架构(模拟器:i386,32位:armv7,64位:arm64)
12. Mach-O的结构里面有啥
UI
- 事件响应链是如何传递的?
- 什么是异步渲染?
- layoutsubviews是在什么时机调用的?
- 一张图片的展示经历了哪些步骤?
- 什么是离屏渲染,什么情况会导致离屏渲染?
- CoreAnimation这个框架的作用什么,它跟UIKit的关系是什么?
- UIView与CALayer有什么关系?举例一个CALayer的秒用。
- 显示动画与隐式动画的区别。
内存管理
- ARC方案的原理是什么?它是在什么时候做的隐式添加release操作?
- 循环引用有哪些场景,如何避免?
- 为什么当我们在使用block时外面是weak 声明一个weakSelf,还要在block内部使用strong再持有一下?
- Autoreleasepool是实现机制是什么?它是什么时候释放内部的对象的?它内部的数据结构是什么样的?当我提到哨兵对象时,会继续问哨兵对象的作用是什么,为什么要设计它?(runtime源码)
- 哪些对象会放入到Autoreleasepool中?
- weak的实现原理是什么?当引用对象销毁是它是如何管理内部的Hash表的?(这里要参阅weak源码)
多线程
- 进程,线程,任务,队列概念
- GCD
- 串行,并行,并发
- 同步,异步
- 串行、并发和同步、异步相互结合能否开启新线程
- 主线程和主队列
- 队列与线程的关系
- gcd中常用队列有哪些
- 什么情况下会发生死锁?
- 如何避免死锁?这段代码应该如何修改?
- GCD如何常驻线程?
开启子线程的runloop,然后添加一个监听端口事件。(待细化)
Runtime
- 消息发送的流程是怎样的?
- 关联对象时什么情况下会导致内存泄露?
- 消息转发的流程是什么?
- category能否添加属性,为什么?能否添加实例变量,为什么?
- 元类的作用是什么?
- 类方法是存储到什么地方的?类属性呢?
- 讲几个runtime的应用场景
- 实例对象与类对象的存储结构是什么样的?
- 调用类对象和实例对象的方法时,是如何在内存中查找到方法并调用的?
- 什么是线程安全,为什么UI操作必须在主线程执行
- 开启新的线程有哪些方法
- 多线程任务要实现顺序执行有哪些方法
- 如何实现一个多读单写的功能?
- 用GCD如何实现一个控制最大并发数且执行任务FIFO的功能?
- 怎么去拦截C语言的系统函数
//www.greatytc.com/p/aeb0d891607e
Runloop
- 讲一下对Runloop的理解?
- 可以用Runloop实现什么功能?
- 多线程与Runloop的关系
性能优化
- 对TableView进行性能优化有哪些方式?
- Xcode的Instruments都有哪些调试的工具?
- 讲一下你做过的性能优化的事情。
- 如何检测卡顿,都有哪些方法?
- 缩小包体积有哪些方案?
- APM的具体实现
网络
TCP为什么需要三次握手呢?
TCP为什么挥手需要四次呢?为什么不能将ACK和FIN报文一起发送?
TCP为什么TIMED_WAIT之后要等2MSL才进入CLOSED状态?
TCP怎么保证安全性
校验和
序列号
确认应答
超时重传
连接管理
流量控制
拥塞控制Https为什么握手过程需要三个随机数,而且安全性只取决于第三个随机数?
Charles如何实现HTTPS的拦截?
为什么有些HTTPS请求(例如微信)抓包结果仍是加密的,如何实现的?
DNS解析流程
DNS递归查询
DNS迭代查询
DNS劫持
CDN工作流程
Cookie和Session的区别
Socket
如果某一请求只在某一地特定时刻失败率较高,会有哪些原因
http有没有做过一些http弱网的优化
计算机相关
- 项目编译的流程是什么?手机上的应用程序自点击图标开始到首屏内容展示都经历了哪些步骤?
- 对于基本数据类型,一般是存储到栈中的,它有没有可能存在堆上,什么情况下会存储到堆上?
- 数据库中的事务是什么意思?
- FMDB中事务的实现原理是什么?
- 使用过什么数据库(我回答的Sqlite,Realm),Realm在使用时有哪些注意事项,如何实现批量操作?
- LRU算法是否了解,如何实现一套LRU算法?
- 知道哪些设计模式,怎么理解设计模式的作用?
- 如果有1000万个Int类型的数字,如何对他们排序?
- 设计一套数据库方案,实现类似微信的搜索关键词能快速检索出包含该字符串的聊天信息,并展示对应数量(聊天记录的数据量较大)。
- iOS系统代码中使用了哪些设计模式?
其他开发技能
- Lottie实现动画效果的原理是什么?
- OClint实现静态分析的原理是什么,它是如何做到的?
- MVVM和MVC有什么区别?
- 静态库和动态库的区别是什么?
- 了解Flutter吗?它有没有使用UIKit?它是如何渲染UI的?
- 二进制重排的核心依据是什么?
- 如何设计一套切换主题的方案?
- AVPlayer和IJKPlayer有什么区别?用IJKPlayer如何实现一个缓存视频列表每条视频前1s的内容?
- 类似微博的短视频列表,滑动停留播放,如何实现?
- 使用python做过哪些事?如何理解脚本语言?
- 签名文件里面有啥
- ipa是怎么校验签名的
- 线上的webview怎么去调试,除了用safari浏览器的开发者模式还有别的么
数据结构与算法
- 什么是Hash表,什么是Hash碰撞,解决Hash碰撞有什么方法?
- 如何遍历二叉树?
- 简述下快速排序的过程,时间复杂度是多少?
- 有一个整数数组,如何只遍历一遍就实现让该数组奇数都在前面,偶数都在后面?
- 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
- 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。leetcode 7
- 有红、黄、蓝三种颜色的气球。在牛客王国,1个红气球+1个黄气球+1个蓝气球可以兑换一张彩票。
2个红气球+1个黄气球可以兑换1个蓝气球。
2个黄气球+1个蓝气球可以兑换1个红气球。
2个蓝气球+1个红气球可以兑换1个黄气球。
现在牛牛有a个红气球,b个黄气球, c个蓝气球,牛牛想知道自己最多可以兑换多少张彩票。
软技能
- 做过哪些工作职责之外的事情?
- 经历过最难的一次业务开发是什么样的,最终怎么解决的?
- 最近有学习什么新技术吗?有何收获?
- 你最擅长iOS哪方面的知识?怎么体现出来的?
- 常用哪些开源库,有没有研究过他们的原理?
- 如何保持个人成长?