标签:
面试宝典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之多线程网络篇
标签:
原文地址:http://www.cnblogs.com/jiangchengdong-1216/p/5612008.html