大厂iOS面试题——备战2019
面试题
1、多线程的应用
2、GCD实现多个请求都完成之后返回结果
3、A、B两个int数组,得到A数组中B数组不包含的元素
4、事件传递链,页面上一个按钮,按钮和它的superView有一样的action,为什么只执行button的action?
5、runtime的应用
6、array中加入对象,对象的retainCount会加1 如何是的对象自己管理自己的生命周期
7、bugly的卡慢监控原理
8、如何架构一个APP
9、c中,malloc对象,传入了size,free只要要指针,这是为什么?
10、如何管理手机端团队,包括帮助大家提高技术
11、数据库选择起因(realm 、coreData、FMDB、Sqlite)
12、数据库做过哪些优化
13、arc情况下,编译的时候,系统是怎样增加相关内存管理的代码
14、脚本打包原理
15、app运行过程中,同时最多有几个线程,怎样实现的高并发
1、多线程的应用
一、共享资源
共享资源 : 就是内存中的一块资源同时被多个进程所访问,而每个进程可能会对该资源的数据进行修改
问题 : 假如 线程A 访问了某块资源 C,并且修改了其中的数据,此时 线程B 也访问了 资源C,并且也对 C 中的数据进行了修改;那么等到 线程A 和 线程B 执行结束后,此时,资源C 中的数据就并不是最初的设置了
二、线程通信
通常, 一个线程不应该单独存在,应该和其余线程之间有关系
例如 : 一个线程完成了自己的任务后需要切换到另一个线程完成某个任务;或者者 一个线程将数据传递给另一个线程
三、线程的状态
当一个线程对象创立并开启后,它就会被放到线程调度池中,等待系统调度;如图
当正在运行的线程被阻塞时,就会被移出 可调度线程池,此时不可再调度它
当线程正常结束,异常退出,强制退出时都会导致该线程死亡,死亡的线程会从内存中移除,无法调度
2、GCD实现多个请求都完成之后返回结果
- 同步堵塞
- 栅栏函数
- 调度组
3、A、B两个int数组,得到A数组中B数组不包含的元素
NSArray *arr1 = @[@1,@2,@3,@4,@5,@6,@7,@8];NSArray *arr2 = @[@4,@5,@6,@7,@8,@9,@10,@11];NSMutableArray *mArray = [NSMutableArray arrayWithCapacity:1];for (int i=0; i<arr1.count; i++) { if (![arr2 containsObject:arr1[i]]) { [mArray addObject:arr1[i]]; }}
4、事件传递链,页面上一个按钮,按钮和它的superView有一样的action,为什么只执行button的action?
- hitTest方法:首先会通过调用自身的 pointInside 方法判断客户触摸的点能否在当前对象的响应范围内,假如 pointInside 方法返回 NO hitTest方法直接返回 nil
- 假如 pointInside 方法返回 YES hitTest方法接着会判断自身能否有子视图.假如有则调用顶层子视图的 hitTest 方法 直到有子视图返回 View
- 假如所有子视图都返回 nil hitTest 方法返回自身.
5、runtime的应用
- 具体应用阻拦系统自带的方法调用(Method Swizzling黑魔法)
- 实现给分类添加属性
- 实现字典的模型和自动转换
- JSPatch替换已有的OC方法实行等
- aspect 切面编程
6、array中加入对象,对象的retainCount会加1 如何是的对象自己管理自己的生命周期
[obj autoreleasepool] 将对象加到自动释放池
7、bugly的卡慢监控原理
Runloop的两次source的监控
渲染界面的频率来监控帧率
8、如何架构一个app
架构app 方式方法有很多: MVC MVP MVVM 组件化 路由
9、c中,malloc对象,传入了size,free只要要指针,这是为什么?
总体上说,ptmalloc的内存管理是基于内存池的,而它的内存来源有两种:
1 通过brk()取得
2 通过mmap()匿名映射取得
当客户向ptmalloc请求内存时:
1 首先查找定长内存分配池,假如查找到则返回
2 假如没有空闲内存可供使用,则向操作系统申请一块64Mb的内存,从中切出客户需要的内存,返回
当客户调用free释放内存时:
1 直接将内存放入适当的定长内存池队列
2 假如触发了肯定的条件,则将所有空闲内存合并,假如满足释放条件,将内存一律还给操作系统
当然了,上面的形容中省略了太多的细节。比方什么时候走brk什么时候走mmap, 再比方当请求的内存大于一个阙值时,ptmalloc将会变成一个mmap的简单封装,还有触发内存归还操作系统的条件等等。
不过已经足够答复题目中的问题了:由于malloc的时候记录了大小。
这里还可以得出另一个结论:因为malloc的时候记录了大量的状态,所以在频繁使用malloc分配小内存时,会造成大量的内存白费。举例来说,当反复malloc(1)时,每一次分配的内存在32字节:包括size of previous chunk,size of chunk,bk_chunk_pointer,fd_chunk_pointer共4个指针,合计4 * 8 = 32字节….
10、如何管理手机端团队,包括帮助大家提高技术
这个题没有固定答案,看你个人的经验,团队管理能力
11、数据库选择起因(realm 、coreData、FMDB、Sqlite)
SQLite
SQLite是在世界上使用的最多的数据库引擎,并且还是开源的。它实现了无配置,无服务要求的事务数据库引擎。SQLite可以在Mac OS-X, iOS, Android, Linux, 和 Windows上使用.
因为它是使用ANSI-C开发的,因而它提供了一个简单的,方便使用的编程接口。SQLite也是一个小的,轻量级的,可以被存储在跨平台磁盘文件的完善的数据库。
SQLite之所以这么流行的起因是:
- 独立于服务器
- 零配置
- 多进程和线程下安全访问。
- 在表中使用含有特殊数据类型的一列或者多列存储数据。
Core Data
Core Data是App开发者可以使用的第二大主要的iOS存储技术。你需要根据数据类型和数据量进行管理和存储,SQLite和Core Data都有它们各自的优缺点。Core Data 更加关注于对象而不是传统的表数据库方法。使用Core Data,你可以存储一个Objective-C类的对象。
- 比SQLite使用更多的内存。
- 比SQLite使用更多的存储空间。
- 比SQLite在取数据方面更快。
FMDB
FMDB框架其实只是一层很薄的封装,主要的类也就两个:FMDatabase和FMResultSet。在使用fmdb的时候还需要导入libsqlite3.0.dylib。
core data允许客户使用代表实体和实体间关系的高层对象来操作数据。它也可以管理串行化的数据,提供对象生存期管理与object_graph 管理,包括存储。Core Data直接与Sqlite交互,避免开发者使用本来的SQL语句.
Realm
Realm 是个新技术。Realm天生比前面提到的数据库处理方案更快,更高效。新的处理方案就叫做Realm,它是一个跨平台的移动数据库。它可以在Objective-C 和Swift中使用,并且它是专门为 iOS 和 Android设计的数据库。
Realm最主要的优势是:
- 绝对免费
- 快速,简单的使用
- 没有使用限制
- 为了速度和性能,运行在自己的持久化引擎上。
因为字数上限,以下面试题答案可加iOS交流群:
624212887
,群文件获取完整面试题12、数据库做过哪些优化
13、arc情况下,编译的时候,系统是怎样增加相关内存管理的代码
14、脚本打包原理
15、app运行过程中,同时最多有几个线程,怎样实现的高并发
结语
以上问题加参考答案,部分自己答复(群友答复)+网上博客参考,希望对读者有所帮助,答复的不好勿喷!
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 大厂iOS面试题——备战2019