面试宝典2之多线程网络篇

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试宝典2之多线程网络篇相关的知识,希望对你有一定的参考价值。

面试宝典2之多线程网络篇
1、开发中实现多线程的方案有哪些?
 
1> C语言的POSIX接口:#include <pthread.h>
 
2> OC的NSThread
 
3> C语言的GCD接口(性能最好,代码更精简)
 
4> OC的NSOperation和NSOperationQueue(基于GCD) 
 
 
2、GCD 内部怎么实现的?
 
1> ios和OS X的核心是XNU内核,GCD是基于XNU内核实现的 
 
2> GCD的API全部在libdispatch库中
 
3> GCD的底层实现主要有Dispatch Queue和Dispatch Source
a、Dispatch Queue :管理block(操作) 
b、Dispatch Source :处理事件 
 
 
3、你用过 NSOperationQueue 么? 如果用过或者了解的话,你为什么要使用 NSOperationQueue, 实现了什么? 请描述它和 GCD的区别和类似的地方?
 
1> GCD是纯C语言的API,NSOperationQueue是基于GCD的OC版本封装 
 
2> GCD只支持FIFO的队列,NSOperationQueue可以很方便地调整执行顺序、设置最大并发数量。
 
3> NSOperationQueue可以在轻松在Operation间设置依赖关系,而GCD 需要写很多的代码才能实现 
 
4> NSOperationQueue支持KVO,可以监测operation是否正在执行(isExecuted)、是否结束(isFinished),是否取消(isCanceld)。
 
5> GCD的执行速度比NSOperationQueue快,任务之间不太互相依赖:GCD 任务之间有依赖\或者要监听任务的执行情况:NSOperationQueue 
 
 
 
4、什么是 TCP 连接的三次握手?
 
1、第一次握手:客户端发送 syn 包(syn=j)到服务器,并进入 SYN_SEND 状态,等待服 务器确认;
2、第二次握手:服务器收到 syn 包,必须确认客户的 SYN(ack=j+1),同时自己也发 送一个 SYN 包(syn=k),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态; 
3、第三次握手:客户端收到服务器的 SYN+ACK 包,向服务器发送确认包 ACK(ack=k+1), 此包发送完毕,客户端和服务器进入 ESTABLISHED 状态,完成三次握手。 
 
5、http 协议的组成和特性?
 
答:
组成: http 请求由三部分组成,分别是:请求行、消息报头、请求正文。
 
特性:HTTP 协议的主要特点可概括如下:
 
1.支持客户/服务器模式。
 
2.简单快速:客户向服务器 请求服务时,只需传送请求方法和路径。请求方法常用的有 GET、HEAD、POST。每 种方法规定了客户与服务器联系的类型不同。由于 HTTP 协议简单,使得 HTTP 服务 器的程序规模小,因而通信速度很快。
 
3.灵活:HTTP 允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
 
4.无连接:无连接的含义是限制每次连 接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
 
5.无状态:HTTP 协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。 
 
 
 
6、在项目什么时候选择使用 GCD,什么时候选择 NSOperation? 
 
1、项目中使用 NSOperation 的优点是 NSOperation 是对线程的高度抽象,在项目中使 用它,会使项目的程序结构更好,子类化 NSOperation 的设计思路,是具有面向对 象的优点(复用、封装),使得实现是多线程支持,而接口简单,建议在复杂项目中使用。
 
2、项目中使用 GCD 的优点是 GCD 本身非常简单、易用,对于不复杂的多线程操 作,会节省代码量,而 Block 参数的使用,会是代码更为易读,建议在简单项目中使用。 
 
 
7、网络图片处理问题中怎么解决一个相同的网络地址重复请求的问题? 
 
答:利用字典(图片地址为key,下载操作为value)
 
8、用 NSOpertion 和 NSOpertionQueue 处理 A,B,C 三个线程,要求执行完 A,B 后才能执行 C, 怎么做? 
 
1、创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 
 
2、创建3个操作:
NSOperation *a = [NSBlockOperation   blockOperationWithBlock:^{ NSLog(@”operationA---“);
}];
NSOperation *b = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@”operationB---“);
}];
NSOperation *c = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@”operationC---“);
}]; 
 
3、添加依赖:
[c addDependency:a]; [c addDependency:b]; 
 
4、执行操作
[queue addOperation:a]; 
[queue addOperation:b]; 
[queue addOperation:c]; 
 
 
 
 
 
9、列举 cocoa 中常见对几种多线程的实现,并 谈谈多线程安全的几种解决办法及多线程安全怎么控制? 
 
1> 只在主线程刷新访问UI
 
2> 如果要防止资源抢夺,得用synchronized进行加锁保护
 
3> 如果异步操作要保证线程安全等问题,尽量使用GCD(有些函数默认 就是安全的) 
 
10、多线程有哪些优点?有哪些缺点?
 
1> 优点:
   a、使应用程序的响应速度更快,用户界面在进行其他工作的同时仍始终保持活动状态;
   b、优化任务执行,适当提高资源利用率(cpu,内存);
 
2> 缺点:
   a、线程占用内存空间,管理线程需要额外的CPU开销,开启大量线程,降低程序性能;
   b、增加程序复杂度,如线程间通信,多线程的资源共享等;
 
11、iOS中实现延时操作有哪些方法?
 
1> performSelector:@selector:withObject: afterDelay:
 
2> dispatch_after(dispatch_time(DISPATCH_TIME_NOW,(int64_t)(int * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{..});
12、XML解析方式有哪些?各有什么特点?
1> SAX 方式解析:
   a、只读
   b、速度快
   c、从上向下
   d、通过5个代理方法解析,每个代理方中都需要写一些代码!
   e、适合比价大的XML的解析
 
2> DOM解析的特点:
   a、一次性将XML全部加载到内存,以树形结构
   b、好处,可以动态的修改,添加,删除节点
   c、内存消耗非常大!尤其横向节点越深!
13、json 和 xml的区别?
 
1> 解码难度: json的解码难度基本为零,xml需要考虑子节点和父节点。
 
2> 数据体积&传输速度: json相对于xml来讲,数据体积小,json的速度远远快于xml
 
3> 数据交互: json与javascript的交互更加方面,更容易解析处理,更好的数据交互
 
4> 数据描述: xml对数据描述性比较好
 
14、HTTP请求常用的几种方式有哪几种?
 
1> GET:获取指定资源。
 
2> POST:向指定资源提交数据进行处理请求,在RESTful 风格用于新增资源
 
3> HEAD :获取指定资源头部信息
 
4> PUT :替换指定资源(不支持浏览器操作)
 
5> DELETE: 删除指定资源
 
15、POST请求常见的数据格式有哪几种?
 
1> application/x-www-form-urlencoded(浏览器支持):主要向服务器提交用户隐私相关的信息。
 
2> multipart/form-data(浏览器支持):向服务器上传小文件,一般不超过2M
 
3> application/json:向后台服务器提交结构化数据。
 
4> text/xml:向后台服务器提交结构化数据。
 
16、SQLite和CoreData的区别是什么?
 
1> CoreData可以在一个对象更新时,其关联的对象也会随着更新,相当于你更新一张表时,其关联的其他表的也回随着更新。
 
2> CoreData提供更简单的性能管理机制,可以限制查询记录的总数,这个类会自动更新其缓存
 
3> 多表查询方面,CoreData没有SQL直观,没有类似外连接,左连接等操作。
 
17、NSURLConnection和NSURLSession的区别?
 
1> 异步请求不需要NSOperation包装
 
2> 支持后台运行的网络任务(后台上传下载)
 
3> 根据每个Session做配置(http,header,Cache,Cookie,protocal,Credential),不再在整个App层面共享配置
 
4> 支持网络操作的取消和断点续传(继承系统类,重写main或者start方法)
 
5> 改进了授权机制的处理
 
18、oc&js如何互调?
 
1> oc调用js:
   [self.webView stringByEvaluatingJavaScriptFromString:“window.location.href = xxx”];
 
2> js调用oc: 
   a、利用hmtl中js的重定向技术:<Script> window.location.href = www.baidu.com//method:dosomething </Script> 
   b、使用方法截取重定向
(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
 
 
 
19、TCP与UDP有什么区别?
 
1> TCP属于强链接,UDP属于无链接;
 
2> 对系统资源的要求(TCP较多,UDP少
 
3> UDP程序结构较简单
 
4> TCP属于流模式,UDP属于数据报模式 
 
5> TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。
 
 
 
 
20、NSCache的特点是什么?
 
1> 线程安全的 
 
2> 当内存不足的时候,自动释放 
 
3> NSCache对key强引用,NSMutableDictionary对key进行copy
 
21、请谈一谈你对tableView性能优化的见解?
 
1> 重用:懒加载
 
2> 渲染优化:尽量使用不透明的图,把 views 设置为透明
 
3> 在ImageView设置前,尽量先调整好图片大小,尤其放在uiscrolliview中自动缩放耗能
 
4> 避免使用过大的xib
 
5> 不要阻塞主线程,除渲染,触摸响应等,尽量异步处理:如存储,网络异步线程通知 
   
6> 缓存:网络响应,图片,计算结果(行高),网络响应NSUrlconnection默认缓存request,设置策略非网络请求,使用nscache nsdictionary
 
7> 避免反复处理数据,在服务器端和客户端使用相同的数据结构
 
8> 选择正确的数据格式。
   json:速度快 解析方便。
   Xml:sax方式逐行解析 解析大文件不占用内存和损失性能
 
9> 选择正确的数据存储选项:plist,nscoding,NSUserDefaults,sqlite coredata。
 
 
22、如何解决资源抢夺?
 
1> @sychronized{ }
 
2> dispatch_barrier_async
 
3> NSLock NSCondition
 
4> dispatch_semaphore_wait
 
 
23、即时通讯中的大数据是怎么处理的?
 
答:用put上传到文件服务器,然后发带url的自定义格式的给对方, 对方接收到之后下载。
 
24、如果在网络数据处理过程中,发现一处比较卡,一般怎么解决?
 
1> 检查网络请求操作是否被放在主线程了 
 
2> 看看异步请求的数量是否太多了(子线程数量) 
 
3> 数据量是否太大?如果太大,先清除一些不必要的对象(看不见的数据、图片) 
 
4> 手机CPU使用率和内存问题 
 
25、怎么解决 sqlite 锁定的问题?
 
1> 设置数据库锁定的处理函数
int sqlite3_busy_handler(sqlite3*, int(*)(void*,int), void*);
 
2> 设定锁定时的等待时间
int sqlite3_busy_timeout(sqlite3*, 60);

以上是关于面试宝典2之多线程网络篇的主要内容,如果未能解决你的问题,请参考以下文章

神啦!最全“Java面试宝典+Java核心知识集”,一箭双雕杠秋招

面试宝典Android篇

Java面试题⭐多线程篇⭐(万字总结,带答案,面试官问烂,跳槽必备,建议收藏)

Java面试题⭐多线程篇⭐(万字总结,带答案,面试官问烂,跳槽必备,建议收藏)

Java面试题⭐多线程篇⭐(万字总结,带答案,面试官问烂,跳槽必备,建议收藏)

Java面试题⭐多线程篇⭐(万字总结,带答案,面试官问烂,跳槽必备,建议收藏)