iOS

面试题整理1(保持更新...)

2017-02-08  本文已影响68人  继续向前冲

此前写过各大IT公司的面试题,不过这远远不够呀,想要当个学霸,还是得接触各种各样的面试题。所以会不定期的更新一些面试题,当做整理,同时也希望能让各位有需要的童鞋节省点时间。

1.属性readwrite, readonly, assign, retain, copy, nonatomic各是什么作用,在那种情况下用?

autorelease 和 @autoreleasepool区别(网易)

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

不需要,因为数组的内存首地址没有改变,只不过是数组的容量改变了。

unsafe_unretained , weak, assign 区别(网易)

assign使用之后,如果没有置为nil,可能会产生野指针。
weak一旦不进行使用后,会被释放,此时所指对象会自动变成nil,就不会产生野指针。

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

NSInteger的值发生改变,则要求添加__block修饰

NSThread, NSOperation, GCD区别(网易)

1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程)
2.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题
ØNSOperation/NSOperationQueue 面向对象的线程技术
ØGCD —— Grand Central Dispatch(派发) 是基于C语言的框架,可以充分利用多核,是苹果推荐使用的多线程技术
以上这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单,也是Apple最推荐使用的,在项目中很多框架技术分别使用了不同多线程技术。

通知和KVO区别(网易)

KVO的是KeyValue Observe的缩写,中文是键值观察。这是一个典型的观察者模式,观察者在键值改变时会得到通知。iOS中有个Notification的机制,也可以获得通知,但这个机制需要有个Center,相比之下KVO更加简洁而直接。

深度遍历和广度遍历使用场景(网易)

深度优先遍历不断深入图中并在栈中保存了所有分叉的顶点;广度优先遍历则像扇面一般扫描图,用一个队列保存访问过的最前端的顶点。深度遍历的方式是寻找离起点更远的顶点,只在碰到死胡同时才访问进出的顶点,广度遍历则会首先覆盖起点附近的顶点,只在临近的顶点都被访问完后,才去访问更远的顶点。

Category支持添加属性与成员变量吗 (阿里)

正常情况下不支持,但是可以用runtime机制在运行时添加

iOS7之后, 蓝牙的围栏功能(阿里)

所谓iBeacons,就是一种使用蓝牙低能耗进行微定位的技术,它允许iOS设备使用蓝牙4.0获取位置数据。也就是说,配备iBeacons技术的iOS设备就相当于位置数据的接收方和发送方,在蓝牙时代里进行着数据的互联。
iBeacon的出现让地理定位能够更加精确——从几百米的精度提高到了一米甚至半米。这个精细度非常高的地理围栏,终于可以让很多的实际物体都有条件具有了定义自己地理位置标识的能力,例如一张桌子、一把椅子,都可以有自己的地理坐标

说说Cell重用原理(阿里)

查看UITableView头文件,会找到NSMutableArray? visiableCells,和NSMutableDictnery reusableTableCells两个结构。visiableCells内保存当前显示的cells,reusableTableCells保存可重用的cells。
  比如:有100条数据,iPhone一屏最多显示10个cell。程序最开始显示TableView的情况是:向下拖动tableView,当cell1完全移出屏幕,并且cell11(它也是alloc出来的,原因同上)完全显示出来的时候。cell11加入到visiableCells,cell1移出visiableCells,cell1加入到reusableTableCells。
  所以整个过程并不难理解,但需要注意正是因为这样的原因:配置Cell的时候一定要注意,对取出的重用的cell做重新赋值,不要遗留老数据。
  使用过程中,我注意到,并不是只有拖动超出屏幕的时候才会更新reusableTableCells表,还有: reloadRowsAtIndex,刷新指定的IndexPath。如果调用时reusableTableCells为空,那么cellForRowAtIndexPath调用后,是新创建cell,新的cell加入到visiableCells。老的cell移出visiableCells,加入到reusableTableCells。于是,之后的刷新就有cell做reuse了。
MVC是否了解?介绍下使用情况。(阿里)
模型会把任何数据的变更通知控制器,然后控制器更新视图数据。视图对象通知控制器用户的操作,控制器要么根据需要来更新模型,要么检索任何被请求的数据。
Model:模型保存应用程序的数据,定义了怎么去操作它。例如在本应用中模型就是Album类。
View: 视图是模型的可视化表示以及用户交互的控件;基本上来说,所有的UIView对象以及它的子类都属于视图。在本应用中AlbumView代表了视图。
Controller:控制器是一个协调所有工作的中介者(Mediator)。它访问模型中的数据并在视图中展示它们,同时它们还监听事件和根据需要操作数据。你可以猜猜哪个类是控制器吗?它正是:ViewController。

MVC里面, View怎么通知到Model

应该是不直接交互的,通过controller

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

NSThread

//demo1
//init初始化
NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(thread:) object:@"thread"];
// 开启线程
[thread start];

//demo2
//创建并自动开启方法
[NSThread detachNewThreadSelector:@selector(thread1:) toTarget:self withObject:@"thread1"];

取消
对于线程的取消,NSThread提供了一个取消的方法和一个属性,调用-cancel方法并不会立刻取消线程,它仅仅是将cancelled属性设置为YES。cancelled也仅仅是一个用于记录状态的属性。线程取消的功能需要我们在main函数中自己实现

- (void)cancel NS_AVAILABLE(10_5, 2_0);

要实现取消的功能,我们需要自己在线程的main函数中定期检查isCancelled状态来判断线程是否需要退出,当isCancelled为YES的时候,我们手动退出。如果我们没有在main函数中检查isCancelled状态,那么调用-cancel将没有任何意义。
** NSBlockOperation**
// 创建线程任务
NSBlockOperation *blockOperation = [NSBlockOperation
blockOperationWithBlock:^{
[NSThread sleepForTimeInterval:2];
NSLog(@"one - %@", [NSThread currentThread]);
}];;// 执行线程任务
[blockOperation start];

// 取消线程

GCD
默认是不可以取消的 推荐一篇文章慢慢参考
Parse的底层多线程处理思路:GCD高级用法

断点续传的原理,以及怎么实现

推荐文章 浅析 iOS 应用开发中的断点续传

腾讯sng面试题

腾讯sng面试题

什么时候可以回答这些就成功了!!!
你使用过Objective-C的运行时编程(Runtime Programming)么?如果使用过,你用它做了什么?你还能记得你所使用的相关的头文件或者某些方法的名称吗?
你实现过多线程的Core Data么?NSPersistentStoreCoordinator,NSManagedObjectContext和NSManagedObject中的哪些需要在线程中创建或者传递?你是用什么样的策略来实现的?
Core开头的系列的内容。是否使用过CoreAnimation和CoreGraphics。UI框架和CA,CG框架的联系是什么?分别用CA和CG做过些什么动画或者图像上的内容。(有需要的话还可以涉及Quartz的一些内容)
是否使用过CoreText或者CoreImage等?如果使用过,请谈谈你使用CoreText或者CoreImage的体验。
NSNotification和KVO的区别和用法是什么?什么时候应该使用通知,什么时候应该使用KVO,它们的实现上有什么区别吗?如果用protocol和delegate(或者delegate的Array)来实现类似的功能可能吗?如果可能,会有什么潜在的问题?如果不能,为什么?(虽然protocol和delegate这种东西面试已经面烂了…)
你用过NSOperationQueue么?如果用过或者了解的话,你为什么要使用NSOperationQueue,实现了什么?请描述它和GCD的区别和类似的地方(提示:可以从两者的实现机制和适用范围来描述)。
既然提到GCD,那么问一下在使用GCD以及block时要注意些什么?它们两是一回事儿么?block在ARC中和传统的MRC中的行为和用法有没有什么区别,需要注意些什么?
您是否做过异步的网络处理和通讯方面的工作?如果有,能具体介绍一些实现策略么?
对于Objective-C,你认为它最大的优点和最大的不足是什么?对于不足之处,现在有没有可用的方法绕过这些不足来实现需求。如果可以的话,你有没有考虑或者实践过重新实现OC的一些功能,如果有,具体会如何做?
你实现过一个框架或者库以供别人使用么?如果有,请谈一谈构建框架或者库时候的经验;如果没有,请设想和设计框架的public的API,并指出大概需要如何做、需要注意一些什么方面,来使别人容易地使用你的框架。

TCP连接的三次握手

第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包,即SYN+ACK包,此时服务器进入SYN+RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次状态。

XML数据解析方式各有什么不同,JSON解析有哪些框架?

XML数据解析的两种解析方式:DOM解析和SAX解析;
DOM解析必须完成DOM树的构造,在处理规模较大的XML文档时就很耗内存,占用资源较多,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过遍历树结构可以检索任意XML节点,读取它的属性和值,通常情况下,可以借助XPath查询XML节点;
SAX与DOM不同,它是事件驱动模型,解析XML文档时每遇到一个开始或者结束标签、属性或者一条指令时,程序就产生一个事件进行相应的处理,一边读取XML文档一边处理,不必等整个文档加载完才采取措施,当在读取解析过程中遇到需要处理的对象,会发出通知进行处理。因此,SAX相对于DOM来说更适合操作大的XML文档。
JSON解析:性能比较好的主要是第三方的JSONKIT和iOS自带的JSON解析类,其中自带的JSON解析性能最高,但只能用于iOS5之后。

如何进行网络消息推送

一种是Apple自己提供的通知服务(APNS服务器)、一种是用第三方推送机制。
首先应用发送通知,系统弹出提示框询问用户是否允许,当用户允许后向苹果服务器(APNS)请求deviceToken,并由苹果服务器发送给自己的应用,自己的应用将DeviceToken发送自己的服务器,自己服务器想要发送网络推送时将deviceToken以及想要推送的信息发送给苹果服务器,苹果服务器将信息发送给应用。
推送信息内容,总容量不超过256个字节;
iOS SDK本身提供的APNS服务器推送,它可以直接推送给目标用户并根据您的方式弹出提示。
优点:不论应用是否开启,都会发送到手机端;

缺点:消息推送机制是苹果服务端控制,个别时候可能会有延迟,因为苹果服务器也有队列来处理所有的消息请求;

第三方推送机制,普遍使用Socket机制来实现,几乎可以达到即时的发送到目标用户手机端,适用于即时通讯类应用。
优点:实时的,取决于心跳包的节奏;

缺点:iOS系统的限制,应用不能长时间的后台运行,所以应用关闭的情况下这种推送机制不可用。

网络七层协议

应用层:
1.用户接口、应用程序;

2.Application典型设备:网关;

3.典型协议、标准和应用:TELNET、FTP、HTTP

表示层:
1.数据表示、压缩和加密presentation

2.典型设备:网关

3.典型协议、标准和应用:ASCLL、PICT、TIFF、JPEG|MPEG

4.表示层相当于一个东西的表示,表示的一些协议,比如图片、声音和视频MPEG。

会话层:
1.会话的建立和结束;

2.典型设备:网关;

3.典型协议、标准和应用:RPC、SQL、NFS、X WINDOWS、ASP

传输层:
1.主要功能:端到端控制Transport;

2.典型设备:网关;

3.典型协议、标准和应用:TCP、UDP、SPX

网络层:
1.主要功能:路由、寻址Network;

2.典型设备:路由器;

3.典型协议、标准和应用:IP、IPX、APPLETALK、ICMP;

数据链路层:
1.主要功能:保证无差错的疏忽链路的data link;

2.典型设备:交换机、网桥、网卡;

3.典型协议、标准和应用:802.2、802.3ATM、HDLC、FRAME RELAY;

物理层:
1.主要功能:传输比特流Physical;

2.典型设备:集线器、中继器

3.典型协议、标准和应用:V.35、EIA/TIA-232.

SDWebImage原理

调用类别的方法:

从内存中(字典)找图片(当这个图片在本次程序加载过),找到直接使用;
从沙盒中找,找到直接使用,缓存到内存。
从网络上获取,使用,缓存到内存,缓存到沙盒。

上一篇下一篇

猜你喜欢

热点阅读