Skip to content

Latest commit

 

History

History
145 lines (99 loc) · 5.92 KB

20180914.md

File metadata and controls

145 lines (99 loc) · 5.92 KB

20180914-第七期

本期内容主要包括

  1. NSOperationQueue(郑雨薇)
  2. ICMP协议分享(许云华)
  3. iOS ARC简介(许佳佳)
  4. spring框架(张辰)
  5. 设计模式之线程池模式(冯树勋)
  6. View绘制过程简介(江丁魁)
  7. 线程状态图(张艳强)
  8. 线程的使用(陈伟)
  9. 总结本期知识点

NSOperationQueue

NSOperationQueue【操作队列】:用来存放操作的队列,据其优先级和准备情况执行排队的NSOperation对象。添加到操作队列后,操作将保留在其队列中,直到它报告已完成其任务。

NSOperationQueue操作队列中的任务的执行顺序受到任务的isReady【就绪状态】状态和任务的队列优先级影响。NSOperation操作有个isReady属性,该属性表示操作时否处于就绪状态,处于就绪状态的操作,只要等待系统调度,就会执行。而操作的就绪状态取决于依赖关系,当op1依赖于op2的时候,如果op2还没执行完,op1的isReady = NO,即op1还处于未就绪状态。同处于就绪状态的操作,此时再比较它们的队列优先级(queuePriority),这样才有意义。队列中会先执行处于就绪状态的操作,即便处于就绪状态的操作的队列优先级低于未就绪的操作。所以,要控制操作之间的执行顺序,需要使用依赖关系。

我们可以通过设置NSOperationQueue的最大并发操作数(maxConcurrentOperationCount)来控制任务执行是并发还是串行。

NSOperationQueue有两种不通类型的队列:主队列和自定义队列。主队列在主线程上运行,而自定义队列在后台执行。这两种队列中加入的任务都需要用NSOperation的子类来表示。

ARC简介

ARC的全称Auto Reference Counting. 也就是自动引用计数。 引用计数分为两种: 手动引用计数(MRC) 自动引用计数(ARC)

MRC

开发者要花大量时间在内存管理上,而且容易出现内存泄漏和release一个已被释放的对象,导致crash。

// MRC代码
NSObject * obj = [[NSObject alloc] init]; //引用计数为1
//不需要的时候
[obj release] //引用计数减1
//持有这个对象
[obj retain] //引用计数加1
//放到AutoReleasePool
[obj autorelease]//在auto release pool释放的时候,引用计数减1

ARC

使用ARC,开发者不再需要手动的retain/release/autorelease. 编译器会自动插入对应的代码,再结合Objective C的runtime,实现自动引用计数。 比如如下ARC代码:

NSObject * obj;
{
    obj = [[NSObject alloc] init]; //引用计数为1
}
NSLog(@"%@",obj);

等同于如下MRC代码:

NSObject * obj;
{
    obj = [[NSObject alloc] init]; //引用计数为1
    [obj relrease]
}
NSLog(@"%@",obj);

循环引用,ARC无法回收

这里写图片描述 这里写图片描述

解决方式

1、主动断开循环引用 这里写图片描述 2、使用弱引用

__weak typeSelf(self) weakSelf = self;
[object fetchSomeFromRemote:^{
    __strong typeSelf(weakSelf) strongSelf = weakSelf;
    //从这里开始用strongSelf
}];

3、xcode循环引用检测

设计模式之线程池模式

Worker Thread的所有参与者:   1,Client参与者,发送Request的参与者   2,Channel参与者,负责缓存Request的请求,初始化启动线程,分配工作线程   3,Worker参与者,具体执行Request的工作线程   4,Request参与者

将在Worker线程内部等待任务池非空的方式称为正向等待。 将在Channel线程提供Worker线程来判断任务池非空的方式称为反向等待。

实现方法: 1,利用同步方法来实现,使用数组来作为任务池的存放数据结构。在Channel有缓存请求方法和处理请求方法,利用生成者与消费者模式来处理存储请求,利用反向等待来判断任务池的非空状态。 2,利用同步块来处理,利用Vector来存储客户端请求。在Channel有缓存请求方法和处理请求方法,利用生成者与消费者模式来处理存储请求,利用正向等待来判断任务池的非空状态。

线程状态图

img

  1. **新建状态(New) **: 线程对象被创建后,就进入了新建状态。

  2. 就绪状态(Runnable): 也被称为“可执行状态”。线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程

  3. 运行状态(Running) : 线程获取CPU权限进行执行。需要注意的是,线程只能从就绪状态进入到运行状态。

  4. **阻塞状态(Blocked) ** : 阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:

    等待阻塞 -- 通过调用线程的wait()方法,让线程等待某工作的完成。 同步阻塞 -- 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态。 其他阻塞 -- 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

  5. 死亡状态(Dead) : 线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

spring框架

未收到文件,但是本期分享了该题目。

View绘制过程简介

未收到内容

线程的使用

未收到内容

ICMP协议分享

未收到内容

总结本期知识点

spring框架

当期分享了该框架内容,主要介绍了这个框架的作用,演示了如何启动一个简单的服务器,介绍了spring框架整个调用流程,中间包括了序列化如何使用等