多线程(GCD,socket,http.TCP,UDP,block)

1.线程是什么?进程是什么?二者有什么区别和联系?

     线程是CPU独立运行和独立调度的基本单位(可以理解为一个进程中执行的代码片段)
     进程是资源分配的基本单位(进程是一块包含了某些资源的内存区域)。

     一个程序至少包含一个进程,一个进程至少包含一个线程,一个进程中的多个线程共享当前进程所拥有的资源。

2:谈谈你对多线程开发的理解?iOS中有几种实现多线程的方法?

好处:
1、使用线程可以把程序中占据时间长的任务放到后台去处理,如图片、视频的下载
2、发挥多核处理器的优势,并发执行让系统运行的更快、更流畅,用户体验更好
缺点:
1、大量的线程降低代码的可读性
2、更多的线程需要更多的内存空间
3、当多个线程对同一个资源出现争夺的时候要注意线程安全的问题。

iOS常见的3种多线程的方式:
1、NSThread(两种创建方式)

[NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:self withObject:nil];

NSThread *myThread = [[NSThread alloc] initWithTarget:self selector:@selector(doSomething:) object:nil];
[myThread start];

2、NSOperationQueue

NSOperationQueue *oprationQueue = [[NSOperationQueue alloc] init];

[oprationQueue addOperationWithBlock:^{

//这个block语句块在子线程中执行

}]

3、Grand Central Dispatch (GCD)

“`
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

// 耗时的操作
dispatch_async(dispatch_get_main_queue(), ^{
    // 更新界面
});

});


下面是几个面试题: (必会)


1 多线程的底层实现?
1> 首先搞清楚什么是线程、什么是多线程
2> Mach是第一个以多线程方式处理任务的系统,因此多线程的底层实现机制是基于Mach的线程
3> 开发中很少用Mach级的线程,因为Mach级的线程没有提供多线程的基本特征,线程之间是独立的
2.线程间怎么通信?
1> performSelector:onThread:withObject:waitUntilDone:
2> NSMachPort

3.网络图片处理问题中怎么解决一个相同的网络地址重复请求的问题?
利用字典(图片地址为key,下载操作为value)

也可以使用SDWebImage 第三方框架 其内部已经实现了判断和操作
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中常见对几种多线程的实现,并谈谈多线程安全的几种解决办法及多线程安全怎么控制?
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

  • Dispatch Queue :管理block(操作)
  • Dispatch Source :处理事件(MACH端口发送,MACH端口接收,检测与进程相关事件等10种事件)

7. 你用过NSOperationQueue(队列)么?如果用过或者了解的话,你为什么要使用NSOperationQueue,实现了什么?请描述它和GCD的区别和类似的地方(提示:可以从两者的实现机制和适用范围来描述)。

使用NSOperationQueue是为了简化创建线程 不用手动做那些复杂的操作

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

8. 既然提到GCD,那么问一下在使用GCD以及block时要注意些什么?它们两是一回事儿么?block在ARC中和传统的MRC中的行为和用法有没有什么区别,需要注意些什么?
Block的使用注意:

  • block的内存管理

  • 防止循环retian

  • 非ARC(MRC):__block

  • ARC:__weak__unsafe_unretained

9.在异步线程中下载很多图片,如果失败了,该如何处理?请结合RunLoop来谈谈解决方案.(提示:在异步线程中启动一个RunLoop重新发送网络请求,下载图片)
1> 重新下载图片
2>下载完毕 利用RunLoop的输入源回到主线程刷新UIImageView

10. Socket的实现原理及Socket之间是如何通信的
什么是Socket
socket:套接字 是一种用于网络传输工具
必须告诉socket要传输的内容
socket的实现原理其实是基于TCP/UDP的
socket一般用来做聊天室.传输数据 用TCP/UDP (长链接,双向都能发 )不用http(短连接 而且只能客户端给服务端发)

TCP: 传输控制协议 是一种面向连接的,安全的,基于IP传输层的协议,
TCP在传输数据之前会经过3次握手(理解为打电话)
TCP一般用于网络聊天(长链接) 客户端可以主动的给服务端发请求,服务端也可以主动给客户端发请求
XMPP 是基于TCP的一套即时通讯框架

UDP: 传输控制协议,是一种面向连接的,不安全(可能会丢失数据) , 基于IP传输层协议
游戏或者屏幕广播用的UDP 不安全不用等数据传输完在继续传输,,优点快 ,但是不考虑数据丢失

11 :; Http协议实现
http: 是一种协议,超文本传输协议,定义了网络传输的格式(短连接)
如果利用http做聊天 每次都是重新创建链接,因为ihttp是短链接,一次回话之后就断开了, 如果聊天比较频繁,会不断地创建链接,消耗资源,性能不好.
所以聊天一般都是用socket TCP

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值