iOS技术面试01:多线程与网络
1. 多线程的底层实现?
1> 首先搞清楚什么是线程、什么是多线程、多线程的使用场合(线程有时被称为轻量级进程,是程序执行流的最小单元。多线程是指软件或者硬件实现多个线程并发执行的技术。多线程的使用场合:1程序包含复杂的计算任务;2处理速度较慢的外围设备;3程序设计自身的需要)
2> Mach是第一个以多线程方式处理任务的系统,因此多线程的底层实现机制是基于Mach的线程3> 开发中很少用Mach级的线程,因为Mach级的线程没有提供多线程的基本特征,线程之间是独立的(如果面试官问还有ma再回答这个)
4> 开发中实现多线程的方案:
l C语言的POSIX接口:#include <pthread.h>
l OC的NSThread
l C语言的GCD接口(性能最好,代码更精简)
l OC的NSOperation和NSOperationQueue(基于GCD)
2.线程间怎么通信?
1> GCD
2> performSelector:onThread:withObject:waitUntilDone:
performSelectorOnMainThread:withObject:waitUntilDone:
3> NSMachPort(可选)
4.用NSOpertion和NSOpertionQueue处理A,B,C三个线程,要求执行完A,B后才能执行C,怎么做?
// 创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 创建3个操作
NSOperation *a = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@”operation1---“);
}];
NSOperation *b = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@”operation1---“);
}];
NSOperation *c = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@”operation1---“);
}];
// 添加依赖
[c addDependency:a];
[c addDependency:b];
// 执行操作
[queue addOperation:a];
[queue addOperation:b];
[queue addOperation:c];
5.列举cocoa中常见对几种多线程的实现,并谈谈多线程安全的几种解决办法及多线程安全怎么控制?
NSThread;GCD;NSOperation.
1> 只在主线程刷新访问UI
2> 如果要防止资源抢夺,得用synchronized进行加锁保护
3> 如果异步操作要保证线程安全等问题, 尽量使用GCD
6.GCD内部怎么实现的
1> iOS和OS X的核心是XNU内核,GCD是基于XNU内核实现的
2> GCD的API全部在libdispatch库中
3> GCD的底层实现主要有Dispatch Queue和Dispatch Source
l Dispatch Queue :管理block(操作)
l Dispatch Source :处理事件(比如线程间的通信)
(1GCD的一个重要概念是队列,它的核心理念:将长期运行的任务拆分成多个工作单元,并将这些单元添加到dispath queue中,系统会为我们管理这些dispath queue,
为我们在多个线程上执行工作单元,我们不需要直接启动和管理后台线程。
2 系统提供了许多预定义的dispath queue,包括可以保证始终在主线程上执行工作的dispath queue,
也可以创建自己的dispath queue,而且可以创建任意多个,GCD的dispath queue严格遵循FIFO(先进先出)原则,
添加到dispath queue的工作单元将始终按照加入dispath queue的顺序启动。
3.dispatch queue按先进先出的顺序,串行或并发地执行任务
1> serial dispatch queue一次只能执行一个任务, 当前任务完成才开始出列并启动下一个任务
2> concurrent dispatch queue则尽可能多地启动任务并发执行)
7. 你用过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快
8. 既然提到GCD,那么问一下在使用GCD以及block时要注意些什么?它们两是一回事儿么?block在ARC中和传统的MRC中的行为和用法有没有什么区别,需要注意些什么?
Block的使用注意:
1> block的内存管理
2> 防止循环retian
l 非ARC(MRC):__block
l ARC:__weak\__unsafe_unretained
9.在异步线程中下载很多图片,如果失败了,该如何处理?请结合RunLoop来谈谈解决方案.(提示:在异步线程中启动一个RunLoop重新发送网络请求,下载图片)
1> 重新下载图片
2> 下载完毕, 利用RunLoop的输入源回到主线程刷新UIImageVIUew
iOS技术面试01:多线程与网络的更多相关文章
- iOS技术面试08:其他
1 客户端安全性处理方式? 1> 网络数据传输(敏感数据[账号\密码\消费数据\银行卡账号], 不能明文发送) 2> 协议的问题(自定义协议, 游戏代练) 3> 本地文件存储(游戏的 ...
- iOS技术面试07:第三方框架
1ios框架分为:cocoa Touch:UIKit.Foundation.附属框架 Media:OpenGL ES.EAGL.Quartz.Core Animation.Core Audio. ...
- iOS技术面试06:应用程序
1.NSRunLoop的实现机制,及在多线程中如何使用 NSRunLoop是IOS消息机制的处理模式 >1.NSRunLoop的主要作用:控制NSRunLoop里面线程的执行和休眠,在有事情做的 ...
- iOS技术面试04:数据存储
如果后期需要增加数据库中的字段怎么实现,如果不使用CoreData呢? 编写SQL语句来操作原来表中的字段 1> 增加表字段 ALTER TABLE 表名 ADD COLUMN 字段名 字段类型 ...
- iOS技术面试03:Foundation
是否可以把比较耗时的操作放在NSNotificationCenter中 如果在异步线程发的通知,那么可以执行比较耗时的操作: 如果在主线程发的通知,那么就不可以执行比较耗时的操作 3.Foundati ...
- iOS技术面试02:内存管理
怎么保证多人开发进行内存泄露的检查. 如何定位内存泄露? 1> 使用Analyze进行代码的静态分析(检测有无潜在的内存泄露) 2> 通过leak检查在程序运行过程中有无内存泄露 3> ...
- iOS技术面试05:UI控件
怎么解决缓存池满的问题 1> 优先移除使用次数比较少的对象 2> 优先移除缓存时间最长的对象(让年轻的活下来) 3> 优先移除占用内存比较大的对象 CAAnimation的层级结构 ...
- iOS的三种多线程技术NSThread/NSOperation/GCD
1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的"并发"技术,使得程序员可以不再去关心 ...
- iOS开发——面试指导
iOS面试指导 一 经过本人最近的面试和对面试资料的一些汇总,准备记录这些面试题,以便ios开发工程师找工作复习之用,本人希望有面试经验的同学能和我同时完成这个模块,先出面试题,然后会放出答案. 1. ...
随机推荐
- require sqlite3时报The specified module could not be found.错误
http://dependencywalker.com/ 在这个站点下载对应平台的Dependency Walker,打开你自己编译好的.node文件(sqlite3\lib\binding\node ...
- python线程池及其原理和使用
python线程池及其原理和使用 2019-05-29 17:05:20 whatday 阅读数 576 系统启动一个新线程的成本是比较高的,因为它涉及与操作系统的交互.在这种情形下,使用线程池可以很 ...
- Find Peak Element II
Description Given an integer matrix A which has the following features : The numbers in adjacent pos ...
- 使用jQuery快速高效制作网页交互特效---JavaScript对象及初始面向对象
一.JavaScript中的基本数据类型 number(数值类型) string(字符串类型) boolean(布尔类型) null(空类型) undefined(未定义类型) ...
- asp.net利用webuploader实现超大文件分片上传、断点续传
ASP.NET上传文件用FileUpLoad就可以,但是对文件夹的操作却不能用FileUpLoad来实现. 下面这个示例便是使用ASP.NET来实现上传文件夹并对文件夹进行压缩以及解压. ASP.NE ...
- NodeJS基础知识
console.log方法: console.log("This is a test string"); node app.js 使用重定向标准输出流: node app.js 1 ...
- 数据结构实验之查找一:二叉排序树 (SDUT 3373)
二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),也称二叉搜索树. #include <stdio.h> #include <s ...
- windows使用强大的wget工具
原文链接:https://www.cnblogs.com/hzdx/p/6432161.html wget下载地址:http://www.interlog.com/~tcharron/wgetwin. ...
- 重启hdfs集群的时候,报大量的gc问题。
问题现象: 2019-03-11 12:30:52,174 INFO org.apache.hadoop.util.JvmPauseMonitor: Detected pause in JVM or ...
- Js 之cookie插件(jquery.cookie.js)
一.代码 (function (factory) { if (typeof define === 'function' && define.amd) { // AMD define([ ...