iOS_interview
原文出处:一份"有点难"的iOS面试题
看到这个题目是一个群里的朋友发的,感谢那个兄弟,看到MrPeak大大出的题目啊 好开心,试着答,各位大大请轻喷,刚好不怎么忙,带着耳机听歌,答了一个小时,真舒服啊,看到这些题目好多都不怎么知道,恶补,学习。
1.NSString如何计算字符的个数?
应该是用countElements的函数来统计字符串所包含的字符个数,把参数为要统计的字符串就好了。 但是需要注意以下的几个点: 1.因为不同的Unicode字符,同样的字符不同的编码都可能导致占用不同的内存。所以按正常来说,字符串中的每个字符会占用不同的内存。因此,只能通过遍历字符串中的每个字符来计算字符串的长度。但是当在处理一个特别长的字符串的话,可以通过遍历遍历整个字符串,这样既可以算出字符串的长度了。 2.同一个字符串,countElements计算出来的字符个数与NSString的length计算出来的长度也不一定总是一样的的。因为NSString的长度是基UTF-16编码的编码来计算的,而不是Unicode编码的个数。但是,好像在Swift中可以使用字符串的utf16count属性来来获得原来NSString的length值,忘记了,很久没用Swift了。
2.PKI体系当中加密和签名有什么区别?
这个问题我来答的话,应该先说说PKI是一种安全技术, 数字签名和加密基本原理是什么,在说区别,话说基本原理我也不记得了,就大概记得一个HUSH函数什么的了,他们的过程都是使用公开密钥体系,但实现的过程是不同的,相反,使用的密钥对也不同。 1.数字签名是发送方的密钥对,发送方用自己的私有密钥进行加密,接收方用发送方的公开密钥进行解密,大致就是这样吧,它一个一对多的关系,任何拥有发送方公开密钥的人都可以验证数字签名的正确性,还有只采用了非对称密钥加密算法,能保证发送信息的完整性、身份认证和不可否认性。 2.数字加密是接收方的密钥对,这是多对一的关系,任何知道接收方公开密钥的人都可以向接收方发送加密信息,只有唯一拥有接收方私有密钥的人才能对信息解密,用的对称密钥加密算法和非对称密钥加密算法相结合的方法,它能保证发送信息保密性。
3.如何自己高效实现NSUserDefault?
这个,真心不知道,peak大大。只知道NSUserDefaults是定时把缓存中的数据写入磁盘的,而不是即时写入,为了防止在写完NSUserDefaults后程序退出导致的数据丢失,可以在写入数据后使用synchronize强制立即将数据写入磁盘,现在要高效的实现NSUserDefaults,个人见解就是不频繁的使用synchornize,自定义一个类,再存取时通过NSData做载体。
4.解释下tcp的慢启动特性。
现在公司应该都是在避免慢启动,做性能优化吧,优化应该可以尽量把大量小文件放在一个TCP连接中排队传输吧,没试验过,自己YY的。 这问的是Tcp慢启动的特点,难道就是它在新建立的连接不能够一开始就发送大尺寸的数据包,而只能从一个小尺寸的包开始发送,在发送和数据被对方确认的过程中去计算对方的接收速度,来逐步增加每次发送的数据量,但是这样的话 性能呢,请科普下,谢谢。
5.如何用HTTP实现长连接?
首先HTTP是无状态的,要维持一个长连接可以用心跳包啊,公司项目第一个版本就是这样用的,然后各种原因,各种呵呵呵,丢包,沾包,应该可以对http连接进行轮询,但是http定时轮询会存在延迟 用户体验就不好了 或者用socket流方法,监听服务器消息
6.HTTP2.0针对同一个域名的多个请求,会建立多少个tcp连接?
一个吗?不是很清楚啊。
7.数据库建表的时候索引有什么用?
创建索引可以大大提高系统的性能,加快数据的检索速度,加速表和表之间的连接,保证数据库表中每一行数据的唯一性,但是有些列不应该创建索引,这又要考虑到性能了,所以具体情况具体分析了。
8.Full Text Search为什么快?
这我不是后台不是很了解,问题偏后台系统多一点点了,但是自己会写一点点PHP,好像是用空间来换时间,通过分词器,降索引的表分割啥的,不是很清楚原理啊,看来要系统学下后台语言。
9.iOS下如何实现指定线程数目的线程池?
这个问题问的太深了吧,一般开发根本用不到,还好最近在看线程安全方面的书籍,要不然问到真的会懵逼。 1.循环通过pthread_create创建线程,创建s_tfthread对象做为线程句,加入线程数组,s_tftask_content->methord初始化为空函数 2.创建任务执行函数,执行完通过task初始化函数后,在执行函数中通过pthread_cond_wait信号将当前创建的线程挂起 3.创建完之后,程序中将会有n个挂起状态的线程,当需要执行新的task的时候查找,我们就可以根据不同的task标志在k_threads中查询出空闲线程,并创建新的s_tftask_content加入s_tfthread的任务列表,通过pthread_cond_signal重新唤醒该线程继续执行任务
10.介绍下iOS设备获取唯一设备号的历史变迁。
这个没做过几年开发的真心不知道,iOS中获取设备唯一标示符的方法一直随版本的更新而变化。iOS 2.0版本以后UIDevice提供一个获取设备唯一标识符的方法uniqueIdentifier,但是好像是iOS 4还是iOS5就被苹果废弃掉了,然后iOS6是用WiFi的mac地址来获取的,iOS7后大家都知道了,主要是由于苹果又坑爹了,封杀mac地址,但是推荐大家用KeyChain来保存获取到的UDID,因为APP删了再装回来,也可以从KeyChain中读取回来,哈哈,公司的项目都是把UDID存在KeyChain。
11.函数式编程当中的 first-class function是什么意思呢?
这个问题好像以前就在知乎看过,就是类型,定义了一个可以操作的取值的集合,就像C语言的int类型一样,可进行加减乘除等操作,但是它的设计又有一个模块复用和访存控制,这样设计的原因应该是让我们更好用吧,没有深究过这个。
12.如何使用runtime hook一个class的某个方法,又如何hook某个instance的方法?
做到这里在电脑码字快三十分钟了啊,peak大大,你问的问题都好难回答啊,要分各种情况。这题也是首先要考虑 hook是否有公开头文件的类,有的话写一个Utility函数,再使用category,没有的话就建一个类作为新函数载体,然后先为被hook的类增加函数,再替换,没错就是这个样子。后面如何h如何hook某个instance的方法,应该可以定义一个函数指针变量,hook时将要调用的地址赋给这个变量,调用时把这个变量当作函数来用就行了。
13.谈下Objective C都有哪些锁机制,你一般用哪个?
synchronized、NSLOCK、GCD、递归锁、分布锁、同步锁(这个是C语言的),一般用GCD,这里就不说了,真心不想码字了,peak大大可能会问,为什么,又要把各种锁机制对比,这我会疯,我脑袋要死机了,重启中…
14.聊下HTTP post的body体使用form-urlencoded和multipart/form-data的区别。
http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE,刚好公司上个项目都用了这四种方式的请求,怎么都是踩过得坑。 form-urlencoded是默认的mime内容编码类型,是通用的,但是它在传输比较大的二进制或者文本数据时效率极低。 multipart/form-data是当上传文件或者二进制数据和非ASCII数据使用。
15.让你设计一种机制检测UIViewController的内存泄漏,你会怎么做?
这个问题没有考虑过,都是自己写单元测试什么的来测试,都是些基础的测试,一般都是用Instrument来测试一些东西的。自己设计的话,主要还是要考虑一个VC的生命周期。
16.通过[UIImage imageNamed:]生成的对象什么时候被释放?
应该是到@autoreleasepool 结束的时候才释放的,但是我都是用这imageWithContentsOfFile方法加载图片的
17.applicationWillEnterForeground和applicationDidBecomeActive都会在哪些场景下被调用?举例越多越好。
推送、做支付的时候,跳到人家运用,后台杀进程的时候、做IM的时候、第三方授权分享登录回调情况下等等
18.如何终止正在运行的工作线程?
在线程中调用exit、pthread_exit、pthread_kill、pthread_cance都行吧
19.穷举iOS下所有的本地持久化方案。
沙盒 plist文件(属性列表) preference(偏好设置) NSKeyedArchiver(归档) SQLite 3 CoreData 还有请补充...
20.如果公司强制996,你有什么心里话要对老板说吗?
没什么话,习惯了,主要想要对产品经理说你的需求能不能想好在做,不要瞎搞,谢谢
作者:MrPeak 链接:https://www.zhihu.com/question/47218985/answer/104940518 来源:知乎 著作权归作者所有,转载请联系作者获得授权。
碰巧最近我司北京那边也在招iOS leader,谈下我个人面试的几点要求。
创业型公司的话招聘leader岗位一定是技术性的,管理技能和技术实力最多二八开,两成的精力用在管理上已经足够。
管理上的要求面试相对简单,谈管理方式的时候,能注重团队沟通即可,搞技术的都闷一些,大部分的管理问题都是由于缺乏沟通导致的。不用口才多好,思路清晰,谈吐得宜,不偏激,不内敛基本就能说明沟通上不存在问题。
技术方面要求要放高一些,leader一定在知识积累上一定是广度精于深度。iOS方面以下一项都不能缺:
项目基础架构的理解。对架构的了解不用深于架构师,但常见的架构方式及其基本差别应该如数家珍。架构不分对错,能有自己的一套理解会更好。
UI方面需要对性能优化有一定的了解。UI的问题一般比较好定位,麻烦的都是流畅度优化,一旦出了问题,找不准切入点会非常浪费团队时间。
安全方面。非对称加密体系和常用的对称加密算法,以及大大小小都会踩的坑都需要知道。https的安全握手流程是个很好的话题切入点。
网络方面。tcp ip协议要有一定的了解,tcp的三次握手和slow start特性我都会问到。http协议要有非常全面的了解,包括常见的header,body格式。
数据库方面。索引的功能,事务的概念,多线程安全,死锁等都需要知道。
计算机基础方面。基本功很重要,计算机基础直接和解决问题的能力相关,很多时候遇到问题都会去查各种资料,基础是否扎实会影响解决问题的思路。我一般会问到:操作系统的常见线程调度策略,常用的缓存淘汰策略,binary seach tree和hash table访问元素的时间复杂度,还有一些类似的就不一一列出来了。
以上六个方面能游刃有余的话,就可以开始了解对方的期望了。
笔者参加了2017秋季不少的校招iOS岗位面试,下面我把这些面试题都贴出来和大家共勉:
一.搜狐快站
1.谈谈你做过的项目;
2.项目中最有成就感的部分;
3.倒计时如何实现?(NSTimer,还有其他的实现方式吗);
4.UIButton的继承关系?
5.iOS中可以进行输入的控件?(UITextView,UITextField);
6.快排的实现原理;
7.短信验证码会有倒计时功能吗?第一次验证失败后还可以再进行验证吗?
8.Android开发和iOS开发的区别;
二.搜狐社交产品中心
1.我们项目中用到的缓存方式;用的是数据库还是归档?
2.我们项目中使用的网络库是什么?
3.TableView的优化和重用;比如不等高的cell如何重用?不同的cell里面包含的UI不同如何重用?滑动太卡如何优化?
4.图片缓存如何优化?圆角图片如何优化?
5.JSON等数据格式如何模型化?使用哪些第三方库?
6.MVC,MVVM?
7.开发中用到的设计模式?单例、MVC、delegate。
8.数据结构堆与栈的区别;栈与队列的区别;
9.用OC如何实现栈与队列;
10.如何防止死锁;
11.GCD如何实现同步任务,即如何执行完一段代码后再去执行另一段代码;(线程组,barrier,信号量)
12.block如何解除循环引用;
13.block的原理是什么,如何去找到这个block;(函数指针)
14.运行时替换系统的设置颜色的方法,但是在某几处还是要使用系统的方法,如何使用运行时实现;
15.OC和Java的区别;
16.面向对象的三大特性,iOS开发时如何体现面向对象的;
17.你们UI使用什么开发方式;
18.H5混编:OC如何调用js的代码;js调用OC的代码;分别是如何进行调用的;
19.分享功能你们是如何实现的;
20.应用之间如何唤起,如何把scheme加入白名单;
三.蚂蚁金服
1.在第一家实习公司时做的项目,完成了哪些模块;
2.在当前公司时做的项目,完成了哪些模块;
3.序列化与反序列化;JSON怎么转化为模型;
4.iOS中的数据库,CoreData;
5.开源项目中OnceNote中的技术闪亮点;
6.数学建模时做的题目,是怎么建模的,使用了什么工具;
7.Java和OC的优缺点,与Android中的Java有什么区别;
8.NSString为什么用的copy,copy和strong有什么区别;
9.NSCopying,NSCoding,讲讲这两个东西;
10.面向对象的三大特性,讲讲多态;
11.类A想调用类C的方法,类C继承自类B,需要如何实现;
12.一个类实现的功能是越多越好还是越少越好?单一职责原则;
----------------
1.在两家公司做的项目介绍;
2.内联函数是什么?
3.堆和栈的区别;如何优化堆和栈!!!;哪一种会造成内存碎片;block分配在哪里;
4.block的循环引用;block的代码实现;为什么会造成循环引用;block是如何强引用self的;
5.如何去自己实现一个自动释放池;自动释放池的作用;自动释放池是如何管理对象的;
6.static的作用;static const为什么要加static;static const与#define的区别;
7.项目中做的比较好的部分;
8.block在传递的时候,是否会改变存储位置?比如是否会从栈复制到堆;原来的block是否会被释放;
四.微店
1.Block的实现内部机制,外部的变量是怎么传到Block中去的;
2.快速排序的实现,复杂度;有其他哪些排序算法;
3.判断单向链表中是否有环;
4.iOS的内存管理机制,和GC有什么区别;
5.Runtime;
6.C++中函数是如何调用的;
7.如果不使用UICollectionView,那么如何实现瀑布流,如何设计数据结构,讲讲思路;
8.如果有一个比内存大的大文件,那么如何实现排序;
9.http和https的区别,https使用了什么加密算法;
10.https的效率一定比http低吗,是每一次都低吗?
11.storyboard到手机UI显示,整个过程是怎样的?
12.xib、nib需要被编译吗?它们分别是什么类型的文件?
五.网易金融
1.实习期间做的工作,以下问题都是基于实习项目展开的;
2.简单说说你实现哪些功能模块?
3.Autolayout的使用,几个View如何布局,如何设置cell的高度,几个并列的View如何居中?
4.项目中你使用了哪些设计模式?
5.你们项目中是怎样架构的(MVC?MVVM?);
6.你们项目中的多线程是如何实现的?
7.队列有哪些?队列和线程的关系?
8.说说列表功能的实现(涉及cell的自定义等);
9.Block中的循环引用;Block的复制;Block的存储位置;Block如何改变外面的变量;__block修饰符的内部机制!!!;
10.简单的需求:几个任务执行完以后再去做某项任务,如何实现?(GCD线程组?)
11.你是如何进行持续学习的?你是学习方式是怎样的?
12.最近你在学习哪些技术,现在你感兴趣的是哪方面?
13.聊了聊iOS安全方面的内容;
14.Swift中的Protocol。。。;
15.你们的项目用的是OC还是Swift;
16.Category和Extension;Category的缺点和优点;如何克服或者弥补这个缺点(不能添加实例变量,用Runtime实现?);
17.属性修饰符:copy,weak。。。
18.NSNotification是同步的还是异步的???(貌似是同步的)
19.NSNotification的使用需要注意什么?(不用时要移除通知?)
20.Block的嵌套使用;
21.iOS安全,如何在客户端实现一些安全措施。比如如何做用户输入密码时的键盘输入安全。
六.腾讯
1.算法:一棵多叉树,每个节点上有个值,求一条路径上值的和为sum的路径有哪些;
2.在网络请求中,如何来处理网络速度慢、网络中断网络抖动等等网络问题;
3.你做的项目的难点在哪里?
4.你未来三年的规划是什么?
七.百度
1.用过哪些设计模式,用代码实现单例模式,讲讲代理模式的优点,画出代理模式的类结构图;
2.手写二插搜索树的查找,分别用循环和递归实现,哪一种的效率高,递归的空间复杂度是多少;
3.App端的数据缓存;
4.有哪些查找算法,复杂度分别是多少;
5.哈希查找的时间复杂度是多少,如何解决冲突,如何优化哈希;
6.有哪些进程调度或内存管理的算法?(比如先来先服务,高优先级服务,最近最久未使用等等);
7.使用什么数据结构来实现LRU最近最久未使用,画图来模拟一下;
8.Linux命令行,搜索某个文件的命令;
----------------------------
1.项目中的图片上传功能如何实现,为什么使用队列上传,为什么不用异步上传;
2.安卓开发与iOS开发的区别和优缺点;
3.转到后台的应用如何保持活跃,而不被系统kill;应用转到后台的整个过程是怎样的?
4.iOS中如何实现单例,用GCD来实现一下;
5.GCD的全拼;
6.Xcode开发中如何创建一个代码块(代码片);
7.iOS10中的新特性,聊了聊WWDC;
8.对项目中用到的图片选择器的优化和自定义,包括图片多选功能;
9.GCD中如何创建异步线程,GCD中是否能stop一个线程执行;
----------------------------
1.讲讲iOS系统;
2.你们有没有用到什么新的技术;
3.你算法怎么样?
4.讲讲体现你学习能力的事情?
5.为什么从上一家公司实习离职?
八.小红书
1.你实习的项目中哪些是你做的?
2.你觉得我们小红书的App怎么样?
3.手写代码:给定一个字符串,同时给定两个字符,求出包含这两个字符的最小子串的长度;
比如输入:addcddabc ,a ,c
那么包含的子串为:addc, cdda, abc —>最小的子串长度为3;
4.说说iOS和Android开发的区别;
九.网易杭研
1.你们的iOS应用是如何来提高安全性的;
2.应用的砸壳过程;
3.https的秘钥协商过程,证书交换过程;
4.讲讲Runtime,以及消息转发过程;
5.讲讲iOS的内存管理;
6.你们APP中的一些方案选型问题:如网路库选型,页面路由选型;
7.页面的动画或者渲染的优化如何做?讲讲CoreAnimation;
8.讲讲Foundation和CoreFoundation之间的区别;CoreFoundation是不支持ARC的,如何与Foundation之间进行转化。
9.如何实现界面栈的重构,如何移除栈中的界面;
10.如何对UITableView进行优化,你们的cell都是等高的么;
11.如果让你自己实现下拉刷新的功能,你如何实现;
12.MVVM以及代码臃肿问题;
13.简单聊聊ReactiveCocoa以及数据刷新问题;
-------------------------------
十.图片社交in
1.项目中的alert sheet的层级,是添加到哪里?以及key window的层级结构;
2.应用中的安全机制;有哪些对称加密、非对称加密算法;
3.进行直播,使用字典存储观众,观众有进入和离开,人数比较多,如何实现这样一个功能;以及如何实现排序;
4.字典中是如何去进行查找的?并发查找;
5.笔记在更新的时候进行修改,如何处理这种情况,如何防止脏数据;
6.GCD中有哪些方法?
7.讲讲runloop;
8.讲讲runtime;
9.本地化持久方案;
10.在什么时候我们需要使用autoreleasepool;什么时候需要我们手动去写一个autoreleasepool;
11.单例的作用,什么场景下才需要使用单例;
12.ARC是一种编译时特性还是运行时特性;
十一.墨迹天气
1.模块化开发框架有哪些用过?
2.weak的作用;
3.有哪些属性修饰符;
4.混合开发中如何传递数据,即js和oc如何传递数据、参数;
5.做过那些优化?
6.说说我们的App中有哪些需要改进的;
7.讲讲MVC,MVVM;
8.atomic一定是线程安全的吗?
9.iOS中多线程的实现方式;
10.碰到过内存泄露吗?如何查看或者检测内存泄露;
11.你们是如何封装网络请求库的;
十二.同花顺
1.KVO的实现原理;
2.UITableView的复用,如果UITableView的高度很高,即frame的高度超过屏幕高度,会怎么进行复用;
3.weak、assign的区别;
4.什么是死锁;
5.二叉树的搜索,搜索二叉树中所有值为2的节点,并返回,代码实现;
6.讲讲runtime;
7.weak为什么比assign安全,其实现原理是怎样的;
8.消息推送如何实现,整个过程是怎样的;
9.缓存图片如何实现,缓存到哪里;如果图片显示有破损,可能是什么原因造成的;
十三.华为
1.算法:str = “4213523…..54”很长的数字字符串,如何判断是否能被6整除;
2.安卓有哪些特性可以提高安全性;
3.C/C++中有哪些会导致安全问题;
4.你的获奖是什么时候获得的,研究生有没有获得什么奖学金;
5.简单介绍了加壳,混淆,安全,逆向,hook等;
6.学习成绩怎么样?班级前几?
7.你擅长哪种语言;
--------------------------------
1.介绍了自己的Android项目;
2.为什么要上线自己的Android应用;
3.问选择华为项目组的事情;
4.上家公司实习情况;
5.Android应用有哪些收费模式,如何实现收费;
十四.搜狐集团
1.iOS做过哪些渲染优化;
2.二叉树非递归中序遍历代码实现;
3.合并两个已经有序的链表代码实现;
---------------------
1.Android应用是否可以读取本机号码;iOS应用是否可以读取本机号码;
2.使用位运算符实现两个整型加法代码实现,不考虑溢出;
十五.今日头条
1.算法:二叉树的左右子树交换代码实现;
2.页面路由如何实现,如何去维护一张路由表;页面是如何去进行跳转的(runtime);路由表中的键和值分别是什么?如何根据服务器下发的数据加载页面;
3.js和OC如何调用;(js是怎样调用oc的);
4.GCD和NSOperation的区别;哪一个的复用性更好;NSOperation的队列可以cancel吗,里面的任务可以cancel吗;
5.block和self的循环引用;到底是如何循环引用的;
6.SDWebImage的缓存策略,是如何从缓存中hit一张图片的;使用了几级缓存;缓存如何满了如何处理,是否要设置过期时间;
7.讲讲RunLoop;
8.讲讲iOS动画,比如CoreAnimation;
9.屏幕上点击一个View,事件是如何去响应的;
10.深拷贝与浅拷贝;
11.有哪几种类型的block;什么情况下block会从栈区复制到堆区;
12.在一个函数中的局部变量,需要return,那么这个局部变量什么时候会被释放;它是分配在哪里?
13.CALayer和UIView的区别;动画可以作用于CALayer和UIView吗?
14.讲讲runtime,以及hook,以及如何进行方法交换;
15.讲讲逆向工程;
------------------------------------
1.算法:double power(double x, int n)函数实现,最好是O(long)复杂度;
2.使用关联对象把属性添加到category中,具体步骤是怎样的;
3.如何去手动触发KVO,如何让KVO去监听一个方法;
4.weak和assign的区别;
5.weak在它指向的对象被释放后,会被置为nil,该机制是如何实现的;
6.NSString为什么要修饰成copy;block为什么要修饰为copy;
7.哪些属性需要修饰为weak;
8.NSMutableArray在block中修改时,是否要修饰为__block; int类型呢;
-------------------------------------
1.讲讲JSPatch;使用了iOS的什么原理;
2.讲讲MVC,MVVM,MVP;MVP是哪三个单词的缩写;
3.操作系统进程间通讯的方式;
4.讲讲共享锁和互斥锁;
5.进程和线程的区别;
6.UIViewController的生命周期;
7.UITableView滑动卡顿如何解决优化;
8.iOS多线程有哪几种方式;
9.让你印象深刻的学到的技术;安全?
10.Linux和Unix相关知识;
11.http和https的区别;
12.get和post的区别;
13.非对称加密方式有哪些,数字签名如何实现;
十六.中国移动杭研
1.群面题目:移动支付安全;
2.实习中的开发流程;
3.当前手头offer情况;
-----------------------
1.bad_access这个bug是如何出现的?
2.NSString为什么用weak修饰,如果使用strong修饰会怎样?
3.讲讲单例设计模式,在什么情况下使用单例模式?
4.iOS响应链;
5.isa指针的作用;
6.列表中图片缓存与内存优化,有没有出现过OOM的情况;
7.手头的offer情况;
8.技术上和生活上有哪些缺陷和不足;
9.默认的属性修饰符有哪些;
10.了解socket吗;
最后真诚希望大家都能拿到心仪的offer。