最新大厂iOS面试题——参考思路

欢迎加入iOS高级交流群:624212887,你们互相交流学习

一、多线程的应用面试

二、GCD实现多个请求都完成以后返回结果sql

三、A、B两个int数组,获得A数组中B数组不包含的元素数据库

四、事件传递链,页面上一个按钮,按钮和它的superView有同样的action,为何只执行button的action?编程

五、runtime的应用数组

六、array中加入对象,对象的retainCount会加1 如何是的对象本身管理本身的生命周期安全

七、bugly的卡顿监控原理服务器

八、如何架构一个APP多线程

九、c中,malloc对象,传入了size,free只须要指针,这是为何?架构

十、如何管理移动端团队,包括帮助你们提升技术并发

十一、数据库选择缘由(realm 、coreData、FMDB、Sqlite)

十二、数据库作过哪些优化

1三、arc状况下,编译的时候,系统是怎么添加相关内存管理的代码

1四、脚本打包原理

1五、app运行过程当中,同时最多有几个线程,怎么实现的高并发

一、多线程的应用

1、共享资源

共享资源 : 就是内存中的一块资源同时被多个进程所访问,而每一个进程可能会对该资源的数据进行修改

问题 : 若是 线程A 访问了某块资源 C,而且修改了其中的数据,此时 线程B 也访问了 资源C,而且也对 C 中的数据进行了修改;那么等到 线程A 和 线程B 执行结束后,此时,资源C 中的数据就并非最初的设置了

2、线程通讯

一般, 一个线程不该该单独存在,应该和其余线程之间有关系

例如 : 一个线程完成了本身的任务后须要切换到另外一个线程完成某个任务;或者 一个线程将数据传递给另外一个线程

3、线程的状态

  • 当一个线程对象建立并开启后,它就会被放到线程调度池中,等待系统调度;如图

13277235-91cc631d26f59f69.png

当正在运行的线程被阻塞时,就会被移出 可调度线程池,此时不可再调度它

13277235-ac8930c9d32be2e5.png

  • 当线程正常结束,异常退出,强制退出时都会致使该线程死亡,死亡的线程会从内存中移除,没法调度

13277235-51b18bd7abded869.png

二、GCD实现多个请求都完成以后返回结果

  • 同步堵塞
  • 栅栏函数
  • 调度组

三、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]];
    }
}

四、事件传递链,页面上一个按钮,按钮和它的superView有同样的action,为何只执行button的action?

  • hitTest方法:首先会经过调用自身的 pointInside 方法判断用户触摸的点是否在当前对象的响应范围内,若是 pointInside 方法返回 NO hitTest方法直接返回 nil
  • 若是 pointInside 方法返回 YES hitTest方法接着会判断自身是否有子视图.若是有则调用顶层子视图的 hitTest 方法 直到有子视图返回 View
  • 若是全部子视图都返回 nil hitTest 方法返回自身.

五、runtime的应用

  • 具体应用拦截系统自带的方法调用(Method Swizzling黑魔法)
  • 实现给分类增长属性
  • 实现字典的模型和自动转换
  • JSPatch替换已有的OC方法实行等
  • aspect 切面编程

六、array中加入对象,对象的retainCount会加1 如何是的对象本身管理本身的生命周期

[obj autoreleasepool] 将对象加到自动释放池

七、bugly的卡顿监控原理

Runloop的两次source的监控
渲染界面的频率来监控帧率

八、如何架构一个app

架构app 方式方法有不少: MVC MVP MVVM 组件化 路由

九、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字节....

十、如何管理移动端团队,包括帮助你们提升技术

这个题没有固定答案,看你我的的经验,团队管理能力

十一、数据库选择缘由(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,获取完整面试题

十二、数据库作过哪些优化

1三、arc状况下,编译的时候,系统是怎么添加相关内存管理的代码

1四、脚本打包原理

1五、app运行过程当中,同时最多有几个线程,怎么实现的高并发

结语

以上问题加参考答案,部分本身回答(群友回答)+网上博客参考,但愿对读者有所帮助,回答的很差勿喷!

相关文章
相关标签/搜索