iOS面试题汇总

群里边看到了有人分享了这篇面试题,拿来主义。。。

#阿里一面

1.Android的activity

2.Category支持添加属性与成员变量吗

3.是否了解设计模式, 用过哪些

4.iOS7之后, 蓝牙的围栏功能

5.MVC是否了解?介绍下使用情况。

6.MVC里面, View怎么通知到Model

7.了解delegate吗?并介绍

8.说说Cell重用原理

9.异步下载如何实现

10.做过最大的项目是什么?主要难点在哪里

11.如果现在要实现一个下载功能, 你要如何设计。说说每个类具体做什么

12.学过哪些语言

13.C++里面虚函数作用

14.对o2o有什么看法(他是o2o部门的)

15.有没有什么想问的

#阿里二面

1.什么时候接触iOS

2.你的这些项目是外包还是自己开发的

3.OC允许多继承吗

4.要用什么方式实现多继承

5.了解内存管理吗, 吧唧吧唧…

6.了解设计模式吗

7.具体说说MVC

8.了解KVO吗

9.如果让你设计KVO, 要怎么设计

10.现在你是如何适配的

11.比较下storyboard和全代码

12.印象比较深的项目, 难点在哪

13.Cell重用机制具体怎么实现

14.如果有1w张图片要在屏幕滚动显示(每张图片满屏), 至少要几个cell, 如何实现循环滚动

15.平时是怎么进行测试的, 内存方面怎么测试

16.平时如何实现网络请求, 一般返回的数据是什么格式, 如何解析..

17.平时自己有没有封装过比较复杂的控件

18.在什么情况使用Notification

19.如何实现类似 “Find My iPhone” 这样功能

#网易
1.自我介绍

2.学习iOS动机

3.对iOS的看法

4.谈项目

5.怎么看待审核被拒

6.怎么完成后期检测, 优化

7.id ,NSObject, id区别

8.了解iOS内存管理吗

9.release 和 autorelease 区别

10.autorelease 和 @autorelease区别

11.weak什么时候用

12.unsafe_unretained , weak, assign 区别

13.__block什么时候用

14.在block里面, 对数组执行添加操作, 这个数组需要声明成 __block吗

15.在block里面, 对NSInteger进行修改, 这个NSInteger是否需要声明成__blcok

16.了解循环引用吗

17.NSThread, NSOperation, GCD区别

18.如何在异步下载时候, 取消下载, 保证流量不浪费

19.了解runtime吗

20.runtime什么时候用

21.通知和KVO区别

22.有序和无序set实现原理区别

23.深度遍历和广度遍历使用场景

24.算法题 * 2

25.常用的设计模式

26.哪些设计模式属于观察者模式

27.总结下刚才面试中哪些不足

28.自己有什么优点

29.有什么想问的

#网易二面

1.如何实现一个数组每个元素依次向右移动k位。(后头的往前面补) 比如: [1, 2, 3, 4, 5] 挪两位变成[4, 5, 1, 2, 3]

2.实现连连看算法

3.T9算法如何实现, 全拼算法

#腾讯

  1. 自我介绍
  2. 如何保证软件质量, 怎么分析Crash日志
  3. Xcode集成的测试工具了解哪些
  4. 如何获取应用数据
  5. 是否接触过友盟
  6. 是否了解Android
  7. 你的个人主页是怎么写的
  8. 谈谈你觉得最重要的一个项目
  9. 谈谈你的xxx项目
  10. 你这个项目里面集成了微信SDK, 谈谈使用感想
  11. 假如我是一名初学者, 你会向我推荐哪些第三方库
  12. 使用了第三方库, 有看他们是怎么实现的吗
  13. 有没有看过大型项目的源码
  14. 强连通量算法
  15. 最短路径算法
  16. 排序算法
  17. 25个人, 每5人1个跑道, 最少经过几次赛跑, 得到前3名

#腾讯二面

在线敲代码

1.求两个整数的最大公约数

2.微信用户都是双向的好友,a是b的好友,那么b一定是a的。给定一个用户列表,有些用户是好友,有些不是,请判断,这些用户是否可以划分为两组,每组内的用 户,互相都不是好友。如果能,请给出这个划分。

##建议:

  1. 基础。 不管是哪个方向, 基础很重要。就比如iOS, objc的方方面面都必须了解。
  2. 全面。 有些东西, 虽然不见得能答好, 但你至少应该懂。
  3. 设计模式。 主流的那些设计模式非常有必要了解。
  4. 算法。 这个不是说恶补能补好的。建议大家长期积累。 另外推荐<剑指offer>这本书。同时, 可以在这里线上答题: 牛客网-剑指offer
  5. 简历一定要真实! 基本上面试官都是围绕简历展开交流的。 懂或不懂, 一问就知道, 没必要搬起石头砸自己的脚
  6. 提前准备。 比如自我介绍, 项目介绍, 职业规划等等。基本都是必问的题目,能提前准备就提前准备好。
  7. 开源, 分享, 积累。 我一直认为, 分享和开源是程序员进步的不二法门。 我建议每个程序员都应该有自己的Github, 有自己的博客。就这几次面试来说, 博客和Github帮了我多。 网易面试官直言, 他们认真看过我的Github, 微信HR问我要CSDN博客ID, 说她很感兴趣。帮助别人, 也是帮助自己。
  8. 沟通。 有时候一个问题, 可能不懂, 甚至题目都不理解。不要害怕, 主动与面试官沟通。 我在网易面试的时候, 关于全拼算法的实现, 我当时连全拼都没一个完整的概念, 它要满足哪些条件更加不清楚。我跟面试官坦诚我不懂这个概念, 与他们的一步步沟通中实现了自己的算法。 所以沟通, 远比闷头写, 到头来还可能错误来的实在。
  9. 自信。 能得到面试机会, 最起码证明, 你很优秀。 我觉得自信很重要。 如果一开始, 就表现的慌慌张张, 畏首畏尾, 那么不管是你自己的发挥, 还是面试官对你的看法, 我觉得都不会很好。

##下边是我之前的总结的
1.内存问题

1.arc的内存问题 block内存问题 — 什么时候用weak
1>.循环引用都是strong会引起内存问题—>strong变weak,assgin
2>.出现无线循环时候,—>合适时候手动关闭循环
3>.arc 和mrc 混编时候 arc类在mrc使用要按照mrc规则  mrc类在arc使用要按照arc规则
4>.arc 只是帮助管理retain,release
5>.arc 把对象置nil后,对象没有指针指向,对象就会马上释放,用于释放对象
6>.arc Strong 对应retain 修饰强引用 weak 对应assgin 对象释放后自动置nil
对象初始化默认修饰用__strong 对象指针默认修饰__autoreleaseing
7>.__autoreleasing 一般用于方法返回值时候默认添加的很少显示的添加
8>.不能使用NSAutoreleasePool 使用@autoreleasePool
9>.arc 中block内存问题,如果block中引用了某个对象会对该对象引用计数加1,所以如果block引用了某个对象要用__block或者__weak来修饰。
10.>CF*对象转换NS*对象时候要用__bridage 修饰符来桥接

2.多线程 NSThread GCD

1>.NSThread
比较轻量级 但是要自己管理生命周期线程同步,线程加锁lock\unlock  | NSCondition lock\unlock 也可以
  @synchronized(obj) {} 互斥锁,obj 是要锁住的对象,{}是要锁的代码
 锁定一份代码只用一个互斥锁,多个是无效的
       缺点是消耗大量CPU资源
2>. NSOperationQueue
工作原理:底层GCD实现,初始化子类,添加到operationQueue中 重写main方法自己执行线程
         可以设置并发线程数量
        可以用 [queue cacelAllOperations];停止线程 suspend 暂停|resume重新开始
3>.GCD dispatch queue(官方推荐使用)
工作原理:底层还是线程实现,让程序平行排队任务,根据可用处理资源,安排他们在任何可用处理器核心上执行任务。任务可以是一个函数,也可以是一个block。
    dispatch_async 执行完通知主线程 可以设置线程优先级
    dispatch_group_async 可以监听一组线程 全部完成后通知主线程
    dispatch_barrier_async 前边的任务完成才会执行,而他后边的任务要等他完成才会执       行。
    dispatch_apply 执行某代码片段N次

3.weak 怎样置nil的 (weak 还是有一定性能消耗的)

建议是只在避免循环引用的时候使用__weak,一般在代理和block中使用
当weak修饰的对象被释放时候,指针会被赋值为nil,然后调用objc_release,因为引用计数为0 调用dealloc方法。

4.image 的imageName和imageWithContentsOfFile区别

imageName:使用时候系统会cache 程序员是无法处理cache的,所以多次使用该资源时候会提高性能,imageName会更好点
imageWithContentsOfFile:使用时候后会马上释放 如果该资源只是用一两次可以使用这种方式

5.image drawrect 的坐标切换

[image drawInRect:frame];

6.设计模式

1>.代理模式:
 优势 解耦合。Delegate
2>.观察者模式:
 优势 解耦合。KVO,NSNotification
3>.mvc模式:
 通过设计模型,控制器逻辑,视图展示将程序进行逻辑划分。
 优势 使系统层次清晰,逻辑分明
4>.单例模式:Singleton
 确保程序运行期间只有一份实例。
 优势 使用简单,延时求值,易于跨模块。
5>. 工厂模式:工厂类中自定了多个实例化对象接口,运行时候决定实例化哪个对象。
工厂类包含了逻辑判断,可以根据条件动态生成实例化类。减少耦合。

7.nonatomic 非原子性

atomic 原子性:给线程加锁。为了防止一个对象被多个线程同时使用,给线程加锁。因为atomic消耗比较大而iOS中很少有多个线程使用一个对象所以一般使用nonatomic

8.线程安全

1>.@synchronized(obj) {} 互斥锁
 obj 是要锁住的对象,{}是要锁的代码
        锁定一份代码只用一个互斥锁,多个是无效的
        缺点是消耗大量CPU资源
2>.使用原子性atomic修饰属性 :
   线程安全,但是消耗大量CPU资源
建议:所有属性使用nonatomic修饰,
3>. 线程锁:lock/unlock 条件锁:NSCondition lock/unlock
4>. GCD 线程安全:
串行队列执行线程,dispatch_once(只执行一次),dispatch_barriers_async(自定义并发队列)。
5>.NSOperationQueue 设置线程并发数量。
总结:
尽量减少多线程操作一块资源,尽量把加锁,抢占资源的操作交给服务器,减少客户端压力。

9.数据库

10、runtime 运行时机制

runtime 是一个C语言底层库。可以用来实现一些OC不好实现或者不能实现的操作。
1>.程序运行过程中,动态的创建一个类
2>.程序运行过程中,动态为某个类添加属性,方法,或者修改某个类方法
3>.遍历一个类中的所有属性或者方法
4>.相关函数:objc_msgSend:给一个类发送消息
  class_copyMethodList:遍历一个类的所有方法
  class_copyIvarList:遍历一个类的所有属性

11.Clang

12.arm架构 CPU指令集。

13.autorelease pool

原理:对象添加autorelease pool 时候该对象内存地址会添加到autoreleasePoolPage的栈中的然后add一个标记(哨兵对象),然后release时候会从栈顶释放对象直到找到这个标记(哨兵对象)。
嵌套autoreleasePool:Pop 时候释放到标记(哨兵对象)为止,所以嵌套autoreleasePool 互不影响。
使用:1>.新建线程时候。
      2>.for 循环里边有大量的临时变量。

14.arc 内部原理 iOS5引入

1.前端编译器:自动为创建对象插入retain(objc_retain)/release (objc_release)
2.arc 优化器 负责移除多余的retain/release语句

15.UITableViewCell 优化

1>.适当的复用cell
2>.缓存cell高度 不要在heightforrow 里边计算cell 高度
3>.避免设置cell子试图为透明,造成多次渲染
4>.避免使用图形特效,图形特性越多渲染越慢
5>.复杂的界面在drawrect里边利用GPU来绘制view 效率比add view 和xib 高
6>.减少逻辑计算时间

17.KVO,Notification,Delegate 类之间通信区别

1>.delegate 是一对一 通信,delegate 往往需要关注返回值
2>.Notification 一对多通信 不需要关心接收者,比KVO要多一步发送通知,但是范围广,更灵活点
3>.KVO 一对多通信 ,不需要关心接收者,但是局限于属性变化的
4>.属性传值:不灵活
5>.将类整个传过去:不灵活,容易解耦
6>.init方法传值

18.本地数据库海量数据怎么提高查询效率,和存储效率

1>.避免全表查询:进行分表,外链查询,
2>. 在设计where order by 的列上建立索引(一种排序的数据结构,以快速查询,更新数据库数据)。

19.索引的缺点

1>.增加了数据库的存储空间。
2>.添加和修改数据的时候花费较多的时间(因为索引也要跟着改变)。

20.断点续传方案

1>.下载前,判断已经下载好的字节长度。
2>.下载时,根据之前下载好的字节长度,从后边字节开始继续下载。
ASIHttpRequest 方法 setAllowResumeForFileDownloads

21.冒泡排序
NSInteger count = sortArray.count;

for (NSInteger i = 1; i <= count; i ++) {

    for (NSInteger j = 0; j < i; j ++) {

        if(j + 1 < count) {

            if ([sortArray[j] integerValue] > [sortArray[j + 1] integerValue] ) {

                [sortArray exchangeObjectAtIndex:j withObjectAtIndex:j + 1];}} }}

22.PUSH原理 PUSH证书不能是带*号的证书

1>.后台服务器将要发送的消息和iPhone的设备号一起发送到APNS服务器
2>.APNS在已注册的iPhone的设备列表中找到改设备号的iPhone,并发送消息到该iPhone
3>.iPhone收到消息后传送到对应的应用,弹出push

23.socket 编程

1>.TCP:传输层 连接需要三次握手,长连接,断开时需要四次握手
2>.HTTP:应用层 每次都请求都需要服务器回应,处理完后断开连接,称作“一次连接”,“短连接”
3>.TCP/UDP区别:
TCP:面向连接,通信安全,传输数据可靠,速度慢,系统开销比较大。
UDP:面向非连接,传输不可靠,用于少量数据传输,速度快

4>.socket:套接字 是TCP/IP协议软件族通信的软件抽象层,它是一组借口。

工作原理:
1>. 服务端:socket 函数生成一个socket,bind函数将本机ip地址和端口绑定,然后调用listen函数对相应socket监听,当accept接收到一个连接请求时,将生成一个新的socket,服务器显示该请求ip地址,并发送新的socket到客户端“im,sever”,关闭socket。
2>. 客户端:调用socket生成一个socket,bind函数将本地ip地址和端口绑定,然后请求连接服务器,通过新的socket发送消息“im client”,关闭socket。
3>.连接时可以指定通信协议,scoket可以支持不同的通信协议(TCP/UDP)当TCP协议连接时 该socket连接就是TCP连接。

24.NSRunLoop: iOS消息机制处理模式。

作用:控制NSRunloop里边线程的执行和休眠。