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最主要的优势是:
绝对免费
快速,简单的使用
没有使用限制
为了速度和性能,运行在自己的持久化引擎上。
由于字数上限,以下面试题答案可回复“01”欢迎[加入](正在跳转)iOS高级交流平台,获取完整面试题,大家也可互相交流,一起进步
12、数据库做过哪些优化
13、arc情况下,编译的时候,系统是怎么添加相关内存管理的代码
14、脚本打包原理
15、app运行过程中,同时最多有几个线程,怎么实现的高并发
结语
以上问题加参考答案,部分自己回答(好友回答)+网上博客参考,希望对读者有所帮助,回答的不好勿喷!