iOS技能 - 最新美团、百度、腾讯、头条、阿里 面试题目记录

关于面试题,可能没那么多时间来总结答案,有什么需要讨论的地方欢迎大家指教。主要记录一下准备过程,和面试的一些总结,希望能帮助到正在面试或者将要面试的同学吧。

美团
一面
1、简历上写的项目问了一遍,然后开始问知识点。

2、volley的源代码,在图片缓存部分讨论了挺长时间,http中缓存机制,

3、视觉控制器的生命周期

4、数据库

5、多线程(NSTread、NSOPeration、GCDA+block)

6、http协议get post的区别

7、手机适配一些方案

8、真机调试、项目上线注意事项

9、静态方法是否能被重写

这些大概聊了1个半小时,开始的时候还有些紧张,慢慢聊开了,就好多了,面试官的语速有点快,老是需要面试官重复一遍,我也不经意间语速也变快了,不过能看出来面试官还是很厉害的。

二面
1、id和nill代表什么(nill和NULL的区别)

2、向一个nill对象发送消息会发生什么?

3、http中的同步和异步

4、MVC 和 MVVM 的区别。

用 MVVM 实现一个业务。VC 是入口,VC1 显示 “省” 的列表,VC2 显示省关联的 “市” 的列表,VC3 显示市关联的 “县” 的列表。VC 到 VC1,VC1到 VC2,VC2 到 VC3,VC3 再跳转到 VC。相关点在于如何设计 ViewModel 和 Model ,以及 VC3 到 VC。

如何编写单元测试,比如写了一个网络库,如何测试该网络库,用例怎么写的更全面一些。

代码从 Git 上拉下来到生成 .ipa 都有哪些过程,期间都生成了什么文件。

最近读过哪些书,看过哪些框架,有什么收获。

谈到 JSPatch,问 JSPatch 是如何处理 Block 的。

自己擅长的地方。

遇到过什么样的挫折。

新增二面被问到的问题:如果没有instruments,该如何检测memory leak, zombie object 之类的问题。

三面
1、iOS是如何进行资源管理的。

2、Python比较重要的几个特性

3、网络五层结构,每一层协议,由于我网络不是很好,还问了一些其他的问题(例如MAC地址和ip地址的区别等)。

先谈了下前两面的感受和问题,又和面试官聊到了单例和全局变量的区别。

Block和Protocol的区别,Block是为了解决什么问题而使用的。

iOS 的设计模式。iOS 为什么没有类似于 Java 和 C 之类的 “Builder” 的构造模式。

冒泡、插入、快速排序的平均时间复杂度和最坏时间复杂度。

堆排序。

有时间复杂度为 O(n) 的排序吗?

最近从 stackOverFlow 上解决过的问题,读过的开源框架,读过的书,业余兴趣,最有成就感的事情。

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的点击加入群聊iOS交流群:789143298 进群密码123,不管你是小白还是大牛欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术,
大家一起交流学习成长!

阿里
一面
1、介绍项目

2、在KVO中,他是怎么知道监听的对象发生了变化?

3、字典的工作原理 ?怎100w个中是怎么快速去取value?

4、一个上线的项目,知道这个方法可能会出问题,在不破坏改方法前提下,怎么搞?

5、Block和函数指针的区别?

6、性能优化

7、YYModel和AF源码

8、如何自己设计json转model

9、架构

他们的面试官好像都爱问一下底层的东西,比如这次面试上来机会问我KVO的问题。

问题【1】,看着好像很吊的样子,仔细一样不去思考,可能还真不是太了解,

问题【2】,这个就是纯纯的数据结构的问题了。

问题【3】,这个就是iOS的runTime的问题了,要只要isa,和一些swizzling技术

问题【4】,就是看你了解有多广泛了。

二面
1、浅拷贝和深拷贝的区别

2、Block的循环引用、如何解决、原理

3、Block和delegate的比较

4、kvo的实现原理

5、Autorelease pool的实现原理

6、消息转发机制

7、线程死锁的四个条件

8、进程和线程的区别

9、持久化

10、事务的特征

中途还讨论了Masonry的约束应该写在哪里,我说应该写在layoutSubViews,他说会调用多次,然后争论了一会儿

三面
主要问了项目的一些东西 和给一些场景问我如何实现

自我介绍 介绍一些项目难点

主线程是相对于什么而言的

一张图片的内存占用大小是由什么决定的

索引的作用

索引的优缺点

在数组中找最小的k个数

淘宝下拉加载更多如何优化

淘宝页面发送HTTP请求的过程

介绍一下MVVM

知道哪些设计模式

三面面试官主要就聊了一些具体场景问题和一些基础,基础应该是没太大问题。

头条
一面
自我介绍

项目相关

怎么自定义导航跳转

谈谈runtime的理解

KVC的用途

使用method swizzling要注意什么?(进行版本迭代的时候需要进行一些检验,防止系统库的函数发生了变化)

谈对引用计数的理解

谈谈runloop的理解

runloop有哪些状态

autoreleasepool的使用场景

TableView优化,怎么减少卡顿

copy assign retain weak关键词

JSON转Model

代码布局

多屏幕适配

HTTP2

HTTP请求头和响应头

Cookie

NSCache

自己设计一个缓存器

怎么实现LRU

SDWebImage

二叉树先序遍历(递归和非递归)

二面
MVC的一些缺点

讲一讲其它架构

你知道哪些编码方式

算法字符串翻转

多线程的方式和它们的区别

队列和线程的关系

一道线程安全的题

有哪些锁

属性的关键字

assign可以用于OC对象吗

copy和strong的区别

weak如何实现自动赋nil

为什么不可变对象要用copy

assing可以使用在对象中吗

Pod update和pod install的区别

layoutIfNeeded和setNeedsLayout的区别

抓包工具抓取HTTPS的原理

isEquel和hash的关系

bitmap的结构

可变数组的实现原理

如何hook一个对象的方法,而不影响其它对象

如何避免if else

自旋锁和互斥锁的区别

三面
介绍项目,主要介绍自己强项一点的地方

数组cop后里面的元素会复制一份新的吗

数组的浅拷贝与深拷贝

TCP为什么是三次握手和四次挥手

头条一直都是视频面,而且是一条龙服务。总体来说感觉不错,反正主要就是需要基础足够扎实,

百度
一面
1、iOS基础知识

2、Python基础知识,大概是多线程,线程安全,集合类,JVM,类相关知识等。

3、iOS一些源码的阅读

4、优秀的第三方框架源码阅读

5、GLSurfaceView的相关知识,OpenGL,Shader,绘制流程。

6、询问当前做的项目,以及到具体的实现和优化。

7、多进程间的通讯,Binder机制。

8、询问看过哪些框架源码,EventBus,Volley讲了一下。

二面
1、Delegate 、Notification和KVO比较各自的优缺点

2、在一个UI的正中间实现一个正方形的红色视图有几种方式?

3、手触碰到屏幕的时候,响应机制是怎样的?第一响应者是谁?追问 UIView和UIResponse的关系是什么?

4、UIViewController的生命周期是什么?追问 UIViewController 只alloc而没用到的时候,

5、UIViewController 的view是否加载了?如果没有加载那什么时候加载?

直接用UILabel和自己用DrawRect画UILabel,哪个性能好?为什么?哪个占用的内存少?为什么?

6、AFNetworking是否支持ipv6?

7、项目采用64位,为什么要用64位?怎么修改成64位?i386是什么?他们有什么关系?

8、iOS的应用程序有几种状态?追问,退到后台代码是否可以执行?双击home键,代码是否可以执行?

9、一般使用的图标内存为多大?比如200×300的图片,内存应该占用多少比较合理?

10、说说你对内存泄漏的看法,追问,block为什么容易引起内存泄漏?

11、[object copy]是浅拷贝还是深拷贝?为什么是浅拷贝?copy是实现了哪个协议?

12、Images.xcassets和直接用图片有什么不一样?

三面
全是问得iOS方面的问题,问得真的很细,需要基础很扎实,对各个机制真的足够理解,不然确实有点难回答。

1、内存管理方面的

2、多线程

3、各种队列

4、线程锁

5、MVVM

就是考察一下我iOS方面的能力到底是否有水分吧。问得很细,确实需要基础足够扎实才行。

腾讯
一面
1、介绍一下实习的项目,任务分工,做了哪些工作?介绍实习内容

2、网络相关的:项目里面使用到什么网络库,用过ASIHTTP库吗

3、断点续传怎么实现?需要设置什么?

4、在杭州HTTP请求服务器响应快,可能离服务器距离近,而在深圳访问就很慢很慢,会是什么原因?如果用户投诉,怎么分析这个问题?

5、HTTP请求的哪些方法用过?什么时候选择get、post、put?

6、TCP建立连接的过程,断开连接的过程,为什么是四次握手?

7、项目里面的数据存储都用了哪些?知道iOS里面有哪些数据存储方法?什么时候该用哪些方法存储?

8、MVVM如何实现绑定

9、block和通知的区别,分别适用什么场景

10、算法。连续问了好几个,都是数组,层层递进的,但是我忘了,只记得最后是找出数组

11、中重复的数字

12、进程和线程的区别

13、程序在运行时操作系统除了分配内存空间还有什么

14、进程间通信的方式

15、如何检测应用是否卡顿

16、发布出去的版本,怎么收集crash日志?不使用bugly等第三方平台或者这些第三方平台是怎么收集crash日志的?

17、在block里面使用_property会造成循环引用吗?怎么解决?除了使用self->_property,可以使用valueforkey来访问吗 在block里面可以修改它的值吗setvalueforkey?可以修改它的值,可以用valueforkey来解决,显式的的使用self,block外先持有self的弱引用。

二面
1、OC中对象的结构

2、多态

3、Ping是什么协议

4、知道MTU吗

5、ARC和MRC的本质区别是什么?

6、NSThread,GCD,NSOperation相关的。开启一条线程的方法?线程可以取消吗?

7、子线程中调用connection方法,为什么不回调?因为没有加入runloop,执行完任务就销毁了,所以没有回调。

8、MVC和MVVM的区别

9、了解哪些设计模式

10、存一个通讯录,包括增删改查,用什么数据结构

11、autorelease变量什么时候释放?手动添加的是大括号结束的时候释放,系统自动释放是在12、当前runloop循环结束的时候

13、那子线程中的autorelease变量什么时候释放?

14、子线程里面,需要加autoreleasepool吗

15、GCD和NSOperation的区别?

16、项目里面遇到过死锁吗?怎么解决?数据库访问本来就是线程安全的,不会造成死锁啊。什么是死锁?

17、Viewcontroller的生命周期?

18、在init方法里面,设置背景颜色,会生效吗 会生效。为什么会?

19、WWDC2016公布了哪些新特性?对苹果系列的最新特性有关注吗

20、看过哪些源码,讲讲思路

21、两个链表找第一个相同结点

22、字符串旋转

23、找链表的倒数第k个结点

24、把一个链表比某个值大的放在左边,比它小的放在右边

25、二叉树的中序遍历,非递归

👇推荐👇:
大家可以加入iOS技术交流群,群号:789143298 群内提供数据结构与算法、底层进阶、swift、逆向、底层面试题整合文档等免费资料!!!

#include #include #include using namespace std; #define NULL 0 unsigned int key; //用来输入/输出文件流类 unsigned int key2; //key和key2分别是用做了电话号码和姓名的关键字 int *p; struct node //新建节点(用户姓名、地址、电话号码、指向下一个结点的指针 ) { char name[8],address[20]; char num[11]; node * next; }; typedef node* pnode; typedef node* mingzi; //声明了名字和电话两个指针 node **phone; node **nam; node *a; void hash(char num[11]) //以电话号码为关键字建立哈希函数 { int i = 3; key=(int)num[2]; while(num[i]!=NULL) { key+=(int)num[i]; i++; } key=key%20; } void hash2(char name[8]) //姓名为关键字建立哈希函数 { int i = 1; key2=(int)name[0]; while(name[i]!=NULL) { key2+=(int)name[i]; i++; } key2=key2%20; } //强制类型转换,将用户名的每一个字母的ASCLL码值相加并且除以20后的余数 node* input() //输入节点信息 ,建立结点,并将结点的next指针指空 { node *temp; temp = new node; temp->next=NULL; cout<<"输入姓名:"<>temp->name; cout<<"输入地址:"<>temp->address; cout<<"输入电话:"<>temp->num; return temp; } //对于指针类型返回的是地址 int apend() //添加节点 { node *newphone; node *newname; newphone=input(); newname=newphone; newphone->next=NULL; newname->next=NULL; hash(newphone->num); //利用哈希函数计算出对应关键字的存储地址 hash2(newname->name); newphone->next = phone[key]->next; //利用电话号码为关键字插入 phone[key]->next=newphone; //是采用链地址法,拉链法处理冲突的散列表结构 newname->next = nam[key2]->next; //利用用户名为关键字插入 nam[key2]->next=newname; return 0; } void create() //新建节点 { int i; phone=new pnode[20]; //动态创建对象数组,C++课本P188页 for(i=0;inext=NULL; } } void create2() //新建节点 { int i; nam=new mingzi[20]; for(i=0;inext=NULL; } } void list() //显示列表 { int i; node *p; for(i=0;inext; while(p) { cout<name<<'_'<address<<'_'<num<next; } } } void list2() //显示列表 { int i; node *p; for(i=0;inext; while(p) { cout<name<<'_'<address<<'_'<num<next; } } } void find(char num[11]) //在以电话号码为关键字的哈希表中查找用户信息 { hash(num); node *q=phone[key]->next; while(q!= NULL) { if(strcmp(num,q->num)==0) break; q=q->next; } if(q) cout<name<<"_" <address<<"_"<num<<endl; else cout<<"无此记录"<next; while(q!= NULL) { if(strcmp(name,q->name)==0) break; q=q->next; } if(q) cout<name<<"_" <address<<"_"<num<<endl; else cout<<"无此记录"<<endl; } void save() //保存用户信息 { int i; node *p; for(i=0;inext; while(p) { fstream iiout("out.txt", ios::out); //创建一个文件流对象:iiout iiout<name<<"_"<address<<"_"<num<next; } } } void menu() //菜单 { cout<<" 哈希表通讯录"<<endl; cout<<" 0.添加记录"<<endl; cout<<" 2.姓名散列"<<endl; cout<<" 3.查找记录"<<endl; cout<<" 4.号码散列"<<endl; cout<<" 5.清空记录"<<endl; cout<<" 6.保存记录"<<endl; cout<<" 7.退出系统"<>sel; if(sel==3) { cout<<"8姓名查询" <<endl;cout<<"9号码查询"<>b; if(b==9) {cout<<"请输入电话号码:"<>num; cout<<"输出查找的信息:"<<endl; find(num); } else {cout<<"请输入姓名:"<>name; cout<<"输出查找的信息:"<<endl; find2(name);}} if(sel==2) {cout<<"姓名散列结果:"<<endl; list2();} if(sel==0) {cout<<"请输入要添加的内容:"<<endl; apend();} if(sel==4) {cout<<"号码散列结果:"<<endl; list(); } if(sel==5) {cout<<"列表已清空:"<<endl; create();create2();} if(sel==6) { cout<<"通信录已保存:"<<endl; save();} if(sel==7) return 0; } return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值