目前收集了
117道
从2020年到2021年 大厂到小厂的面试题 感兴趣的靓仔靓女可以玩玩,感受一下
如果想一起整理答案的靓仔靓女 可以直接微信联系我
-
1、 一个私有库有30个类,app1想要用里面的5个,app2想要用里面的10个,怎么做
-
2、 如果让你去设计一个代理,实现一对多通知模式,这个应该怎么写呢
-
1、 工作中遇到了什么难点,简历不会写
-
2、 基础算法的东西,时间冗度相关的
-
3、 一个算法时间冗余度是多少?
-
4、 内存泄漏的几种方法
-
5、
autoreleasePool
认识 -
6、 多个
pods私有库
,是如何解决pod install
耗时问题 -
7、 写题,一个满二叉树左节点要指向右节点写一个算法实现
-
8、
OC
和swift
的区别 -
9、 如何给关联对象设置成弱引用
-
10、
weak
unowned
的区别 -
11、
stract
和class
区别 -
12、
http
htpps
的区别get post
的区别 -
13、
a b c
三个方法通过两次交换最后实现什么样的效果
-
1、 你了解过哪些三方库的实现
-
2、 组件化怎么解决依赖
- 3、
KVO
的原理
KVO
是基于 runtime
机制实现的,当某个类的属性对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的 setter
方法。派生类在被重写的setter
方法内实现真正的通知机制,如果原类为Person
,那么生成的派生类名为NSKVONotifying_Person
。
每个类对象中都有一个isa指针
指向当前类,当一个类对象的第一次被观察,那么系统会偷偷将isa指针
指向动态生成的派生类,从而在给被监控属性赋值时执行的是派生类的setter方法
(KVO的这套实现机制中苹果还偷偷重写了class方法,让我们误认为还是使用的当前类,从而达到隐藏生成的派生类)。
键值观察通知依赖于 NSObject
的两个方法: willChangeValueForKey:
和 didChangevlueForKey:
;在一个被观察属性发生改变之前, willChangeValueForKey:
一定会被调用,这就会记录旧的值。而当改变发生后,didChangeValueForKey:
会被调用。
继而observeValueForKey:ofObject:change:context:
也会被调用。
-
4、
kvc
的原理 -
5、 可变数组线程安全吗
-
6、
block
一定会造成强引用吗 -
7、
delloc
的强用顺序 -
8、
SDWeblmage
的底层实现 -
9、 启动是做了什么操作
-
10、 什么时候用mvc,mvp,mvvm
-
11、 从页面A跳转到页面B内存里面会发生什么
-
12、 怎么去实现全局app的点击事件埋点
-
13、 启动阶段需要加载很多动态该怎么去优化耗时
-
14、 为什么要从上家公司离职呢?有组件化开发的经验吗
-
15、 简历投了没反应 希望逻辑出一份简历的模板给大家参考 增加投递成功率
-
16、 经常问项目难点 项目亮点 项目框架不知道怎么回答
-
17、 iOS 主线程具体在什么时候创建的?
-
18、 第三方库的实现分析 实现亮点
-
19、 在哪方面有比较深的研究,技术亮点是什么
-
20、 可变数组的原理
-
21、 你觉得iOS有前途吗
- 1、 为什么
Category
不能添加属性,为什么还要设计ro
,直接添加不是很方便么,如果将flag
改变ro
能不能写入,改变了会怎样
因为属性会生成对应的ivar,编译后的内存结构已经确定了,Category
的数据是在运行时才附加到类,rw
又里面没有ivar_list
。 ro
是为了存储编译后的类的内存结构,直接加会改变内存结构。 改了理论上可以写入,相当于动态创建的类先添加ivar
在注册类是允许的,但是 flag
在很多地方都有判断,直接修改会有崩溃的可能。
在一个分类中添加了一个属性,Xcode
不会自动的为其生成一个下划线开头的成员变量及 set和get方法
,如果你没有手动的实现这两个方法,直接在外面通过点语法调用这个属性,肯定就直接挂了,Unrecognised selector send to instance
,因为他压根就没有这两个方法,所以当你真的在分类中声明了一个属性的时候,就要手动的去实现这个属性的set和get方法,这个时候就要用到运行时机制了,关联上去这个属性的存取过程。
- 2、 KVO`原理,是怎么找到中间类的(isa->中间类)
KVO
是基于 runtime
机制实现的,当某个类的属性对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的 setter
方法。派生类在被重写的setter
方法内实现真正的通知机制,如果原类为Person
,那么生成的派生类名为NSKVONotifying_Person
。
每个类对象中都有一个isa指针
指向当前类,当一个类对象的第一次被观察,那么系统会偷偷将isa指针
指向动态生成的派生类,从而在给被监控属性赋值时执行的是派生类的setter方法
(KVO的这套实现机制中苹果还偷偷重写了class方法,让我们误认为还是使用的当前类,从而达到隐藏生成的派生类)。
键值观察通知依赖于 NSObject
的两个方法: willChangeValueForKey:
和 didChangevlueForKey:
;在一个被观察属性发生改变之前, willChangeValueForKey:
一定会被调用,这就会记录旧的值。而当改变发生后,didChangeValueForKey:
会被调用。
-
3、
Category
和主类方法谁先调用 -
4、
methodswizzling
,用它干了什么,埋了什么点,如果给按钮点击埋点怎么实现,为什么交换方法要自己调用自己不会递归么 -
5、 组件化,依赖下沉,组件通讯
CTM
,Router
,怎么管理组件 -
6、 多线程,如果有1,2,3,4四个任务,要1,2执行完以后执行3,4,用什么实现?
-
7、 应用优化,
premain
,main
,弱网优化,界面优化,内存优化,怎么检测内存泄漏 -
8、
pod install
,pod update
区别,pod lock
是干嘛的 -
9、
dispatch_main sync()
会发生什么 线程怎么保活 -
10、
autoreleasepull
怎么加进去的,什么时候push
,什么时候pop
,什么时候会用
- 11、
weak
原理,一个对象如果有多个weak
指针指向(entry
数组),怎么销毁
系统维护了一个全局的 map表
。这个表里有多个 sideTable
,sideTable
里面有 weak_table(弱引用表)
当通过 __weak
让一个指针指向一个对象的时候,如果这个对象之前没有被注册,就会调用 objc_initWeak()
方法
如果是已经注册的,会调用 objc_storeWeak()
。对象销毁的时候,会调用 objc_destroyWeak()
当然,objc_initWeak()
和 objc_destroyWeak()
最终都会调用objc_storeWeak()
。
objc_storeWeak()
这个方法里,先根据对象的地址,从全局 map表
中找到对应的 sideTable
,然后再从sideTable
中找到对应的 weak_table
,找到弱引用表后,生成或者更新weak_entry_t
。weak_entry_t
里面存了对象的地址和指向对象的所有弱引用指针。
销毁
-
- 调用
objc_release
- 调用
-
- 因为对象的引用计数为0,所以执行
dealloc
- 因为对象的引用计数为0,所以执行
-
- 在
dealloc
中,调用了_objc_rootDealloc
函数
- 在
-
- 在
_objc_rootDealloc
中,调用了object_dispose
函数
- 在
-
- 调用
objc_destructInstance
- 调用
-
- 最后调用
objc_clear_deallocating
- 最后调用
objc_clear_deallocating内部
-
- 从
weak
表中获取废弃对象的地址为键值的记录
- 从
-
- 将包含在记录中的所有附有
weak
修饰符变量的地址,赋值为nil
- 将包含在记录中的所有附有
-
- 将
weak
表中该记录删除
- 将
-
- 从引用计数表中删除废弃对象的地址为键值的记录
- 12、 循环引用,为什么要在
block
中加strong
,不加会怎样
-
13、
SEL
怎么找到imp
的,消息发送流程 -
14、 消息转发流程,引出错误捕捉|
-
15、 错误分析,
dSYM
是干嘛的,如何分析的,怎么防止崩溃,在转发哪一步做 -
16、
js
交互,有没有用过,原理是什么 -
17、 网络,
https
,验证流程,ssl
加密、证书是干嘛的包含哪些信息,tcp udp
,为什么说tcp
是可靠的,postman
也能发起https
请求什么原理、中间人攻击|
-
1、 手写链表翻转
-
2、
fastlane
的理解以及原理 -
3、 你对编解码,音频混合的理解
-
4、 H5交互 数据库 算法 网络
-
5、
内存oom
之后,怎么获取引起oom
的堆栈? -
6、
runtime
[原理+你项目怎么用]: -
7、
runloop
[原理+你项目怎么用]: -
8、 线程[原理+你项目怎么用]:
-
9、
https
与http
的区别 -
10、 界面优化的策略和实际开发
-
11、 谈谈你对离屏渲染的理解和原理
-
12、
swift
里的defer
逃逸闭包: -
13、
swift
初始化方法: -
14、
swift
open
public
等关键字区别 -
15、
swift
和oc
对比: -
16、
swift
的派发机制: -
17、 OC的消息转发机制:
-
1、
TCP UDP
区别 -
2、
socket
的使用和注意事项 -
3、 组建化[流程怎么用,优缺点等]:
-
4、 问你项目用到的技术,优化
-
5、 代理与
block
得区别?weak
与assign
得区别?代理使用assign
会出现问题吗? -
6、 使用
copy
修饰NSMutableary
会出现什么问题? -
7、 数组遍历得方式?哪种方式性能最好
-
8、
runtime
底层实现。使用场景?方法交换得底层?属性关联底层是如何实现得?数组越界?btn点击域 -
9、
sqlite
扩展数据库字段
-
1、 分类得作用?底层是怎样得?
-
2、 对象得内存布局是怎样得?
-
3、
isa
里边存储 得是什么? -
4、 看过哪些第三方库得源码?
AFnetworking、SDWebimage
? -
5、
KVO
的底层是?调用class方法
输出的是什么? -
6、
kvc
底层原理是怎样? -
7、 数据储存的方式?使用过哪些?
sqlite扩展字段
怎么实现? -
8、
runloop
了解吗?底层是怎样的? -
9、
html
和js交互
做过吗?知道webview
怎么和HTML
相互传输数据吗? -
10、 常见的使用的
GCD函数
?队列组底层?信号量底层?栅栏底层?
- 11、 你使用过
dispatch_once
吗?了解底层吗?让你实现一个应该怎么操作?
dispatch_once
源码实现,底层是通过 dispatch_once_f
实现的
-
dispatch_once_t
作为标识下面dispatch_once
的block
是否已执行过。 -
static
修饰会默认将其初始化为0,当值为0时才会执行block
。 -
当block执行完成,底层会将
onceToken
设置为1,这也就是为什么要传onceToken
的地址(static
修饰的变量可以通过地址修改onceToken
的值),同时底层会加锁来保证这个方法是线程安全的"
- 12、 如何让五个任务先执行完之后,再执行后续任务?实现方式有哪几种?
-
1、
talbleview
的性能优化你做过哪些? -
2、 项目中你做过哪些方面的性能优化?
-
3、
内存oom
之后,怎么获取引起oom的堆栈? -
4、 何监控线上版本
APP启动耗时
(包含动态库的加载时间)? -
5、 如何监控线上版本
APP启动
时,每个+load方法
和C++静态变量初始化方法
的耗时? -
6、 在实际工作中,说说关于
crash
或者内存问题的修复例子 -
7、
NSTimer
在项目中有没有用到?在使用的时候有什么地方需要注意的吗?如果使用不当会引起什么问题? -
8、
NSTimer
在项目中有没有用到?在使用的时候有什么地方需要注意的吗?如果使用不当会引起什么问题? -
9、 我们创建一个子线程,并且希望这个子线程能长期存活有哪些方案?
-
10、 我们引入
NSRunloop
的目的是? -
11、 项目中有用到多线程吗?处理耗时任务的子线程任务结束后你们是怎么处理的?
-
12、 有
ABC三个任务
并发执行,等结束后我希望执行第四个任务,这种场景该怎么实现?
-
1、 事件响应链的过程
-
2、 你了解到的排序算法和对应的时间复杂度。
-
3、
TCP和UDP
的区别,他们应运的业务场景是?说一下TCP的三次握手? -
4、
HTTPS
与HTTP
的区别是?HTTPS
用的加密方式是哪一种?详细描述一下HTTPS加密的两个阶段(非对称加密和对称加密) -
5、 分享一下你做的项目中技术含量高的点。
- 6、 为什么动态库多了会影响
App的启动速度
?动态库和静态库的区别是?
由于动态库并不会直接打包到我们二进制文件中,dyld加载动态股前需要遍历所有的 DYLD_INSERT_LIBRARIES
对象,调用loadInsertedDylib
加载,插入后会链接主程序,和链接动态库期间还要完成,最后还要完成若符号的绑定,这样的操作过程是非常耗时的
程序启动前需要把控制器交给dyld,dyld的工作包括链接动态库,动态库多了就会延长dyld的执行时间,也就影响了启动速度。 静态库是编译时链接然后合并到主程序,动态库是运行时链接的,不合并主程序, 静态库每次编译都会生成一份,而动态库如果是系统的只有一份在共享缓存中,自己动态库和静态库一样生成多份,除非是在扩展中使用的动态库
-
区别:动态库是运行时加载,静态库是编译是加载。
-
动态库在
APP
的mach-o
中是单独一块儿,静态库在mach-o
中会和其他代码一样分布。 -
静态库在链接时完整地拷贝至可执行文件中, 被多个依赖多次使用就会有多份冗余拷贝.
-
动态库:在链接时不复制, 程序运行时由系统动态加载到内存, 供程序调用, 系统只加载一次, 多个程序共用, 节省内存(系统动态库)
-
7、 静态库里有个类或者方法,在编译成App之后,它会存在什么位置?是存在、a文件里还是会存在主App的可执行文件里?如果是动态库呢?
-
8、
TableView
在快速滑动的时候App有可能会掉帧,分析一下是什么原因造成的?怎么优化? -
9、
UITableViewCell
上加上特别大的照片在滑动的时候会掉帧,这个怎么优化? -
10、
SDWebImage
图片缓存策略是?自己写一套代码实现这套逻辑。 -
11、 写一下链表翻转
-
12、 字符串相乘(两个字符串如“123”“321”相乘)算法
-
13、 数组和链表的区别
-
14、 栈的特点、
-
15、 红黑树的理解和优缺点
-
16、 怎么保证自己的类一定能调用到自己写的方法?(不知道有没有人会写一个分类,里面有和自己的类方法名字一模一样)(美团)
这八套题掌握了,我相信高薪iOS 你也就不远了! 加油.... 喜欢留个👍再走吧