1.进程的基本概念
(1)每一个进程都有一个应用程序,都有独立的内存空间,一般来说一个应用程序存在一个进程,但也有多个进程的情况
(2)同一个进程中的线程共享内存中的内存和资源
2.多线程的基本概念
(1)每一个程序都有一个主线程,程序启动时创建
(2)主线程的生命周期是和应用程序绑定的,程序结束时,主线程也就停止了
(3)多线程技术表示,一个应用程序有多个线程,使用多线程能提高CPU的使用率,防止主线程阻塞
(4)任何有可能阻塞主线程的任务不要再主线程执行(如访问网络和数据库)
3.
isMainThread
方法返回执行的代码是否在主线程中执行
BOOL
bool1 = [[NSThread
currentThread]
isMainThread];
NSLog(@"bool1 is %d", bool1);
4.
(1)第一种方式创建线程
NSThread *thread = [[NSThread
alloc]
initWithTarget:self
selector:@selector(run)
object:nil];
//手动开启线程
[thread
start];
(2)第二种方式创建线程
[NSThread
detachNewThreadSelector:@selector(run)
toTarget:self
withObject:nil];
(3)第三种方式创建线程
(3)第三种方式创建线程
[self
performSelectorInBackground:@selector(run)
withObject:nil];
(4)第四种方式:block语法启动一个线程
//NSOperationQueue是一个操作队列或者线程池
NSOperationQueue *queue = [[NSOperationQueue
alloc]
init];
//往队列中添加一个操作
[queue
addOperationWithBlock:^{
[self
run];
}];
(5)第五种方式:NSOperation开启一个线程
//不要去直接创建NSOperation对象
NSOperationQueue *queue = [[NSOperationQueue
alloc]
init];
NSInvocationOperation *operation = [[NSInvocationOperation
alloc]
initWithTarget:self
selector:@selector(run)
object:nil];
[queue
addOperation:operation];
(6)第六种方式:创建一个继承于NSOperation的类开启一个线程
NSOperationQueue *queue = [[NSOperationQueue
alloc]
init];
PersonOperation *operation = [[PersonOperation
alloc]
init];
[queue
addOperation:operation];
5.设置并发数
queue.maxConcurrentOperationCount =
1;
6.设置等级
operation.queuePriority
=
NSOperationQueuePriorityVeryLow;
7.
在异步线程中,最好添加上自动释放池
@autoreleasepool {}
8.在多线程中使用定时器必须开启RunLoop,因为只有开启RunLoop保持线程为活动状态,才能保持定时器能不断执行
9.
(1)创建定时器方法一
//此方法默认已经将定时器添加到当前的runloop中去了
NSTimer *timer = [NSTimer
scheduledTimerWithTimeInterval:1
target:self
selector:@selector(timeAction:)
userInfo:nil
repeats:YES];
[[NSRunLoop
currentRunLoop]
run];
(2)创建定时器方法二
//此方法是创建一个定时器,但是并没有把它添加到runloop中去
NSTimer *timer = [NSTimer
timerWithTimeInterval:1
target:self
selector:@selector(timeAction:)
userInfo:nil
repeats:YES];
//往runloop中添加定时器
[[NSRunLoop
currentRunLoop]
addTimer:timer
forMode:NSDefaultRunLoopMode];
[[NSRunLoop
currentRunLoop]
run];
10.
所有有关UI的操作必须放在主线程中执行
11.线程的生命周期存在五个状态:新建、就绪、运行、阻塞、死亡
12.GCD是一个替代诸如NSThread,NSOperationQueue,NSInvocationOperation等技术的一个高效、强大、底层的技术
13.GCD支持同步或异步任务处理,串行或并行的处理队列,非系统调用的信号量机制,定时任务处理,进程、文件或网络的监听任务等
14.GCD优点:
(1)易用:GCD比之thread更简单易用。基于block的特性导致它能极为简单地在不同代码作用域之间传递上下文
(2)效率:GCD实现功能轻量、优雅,使得它在很多地方比之专门创建消耗资源的线程更实用且快速
(3)性能:GCD自动根据系统负载来增减线程数量,这就减少了上下文切换以及增加了计算效率
(4)安全:无需加锁或其他同步机制
15.Dispatch Queue是执行处理的等待队列。通过dispatch_async等函数,按照先进先出(FIFO)顺序追加到Queue中处理
16.两种Dispatch Queue:
(1)Serial Dispatch Queue (Private
Dispatch Queue)—— 等待现在正在执行的任务处理结束
- 一个线程同时执行一个任务,可以避免数据竞争的问题
- 可以生成多个Serial Dispatch Queue,各个Serial Dispatch Queue将并行执行
(2)Concurrent Dispatch Queue (Global
Dispatch Queue) —— 不等待现在正在执行的任务处理结束(并行、并发)
- 多个线程同时执行多个任务,效率高。具体是多少个线程并发执行,取决于CPU核数和CPU负荷
17.获取系统的主线程队列
dispatch_queue_t
queue =
dispatch_get_main_queue();
18.Main
Dispatch Queue是在主线程里执行的队列,即为Serial
Dispatch Queue
19.获取系统默认创建的异步线程队列
dispatch_queue_t
globleQueue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
0);
20.Global Dispatch
Queue是所有应用程序都能够使用的Concurrent Dispatch
Queue
21.Global Dispatch
Queue的4个执行优先级
- DISPATCH_QUEUE_PRIORITY_HIGH
- DISPATCH_QUEUE_PRIORITY_DEFAULT
- DISPATCH_QUEUE_PRIORITY_LOW
- DISPATCH_QUEUE_PRIORITY_BACKGROUND(非常低的优先级,这个优先级只用于不太关心完成时间的真正的后台任务)
22.dispatch_async是指将指定的Block块异步的追加到指定的 Dispatch
Queue中,dispatch_async函数不做任何等待
23.dispatch_sync同步追加Block块,在追加Block结束之前,dispatch_sync函数会一直等待,等待队列前面的所有任务完成后才能执行追加的任务
24.使用dispatch_sync容易引起死锁
25.dispatch_once一次执行。保证dispatch_once中的代码块在应用程序里面只执行一次,无论是不是多线程。所以可以用来实现单例模式,安全、简洁、方便
26.
使用GCD创建单例
+ (Person
*)sharePerson
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
ps = [[Person alloc] init];
});
return ps;
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
ps = [[Person alloc] init];
});
return ps;
}
27.dispatch_after实现延迟调用
- 原理:并不是在指定时间后执行任务处理,而是在指定时间后把任务追加到Dispatch Queue里面,所以会有少许延迟
- 注意我们不能(直接)取消已经提交到dispatch_after里的代码
28.
dispatch_time_t->when
什么时候执行延迟调用的代码
dispatch_queue_t -> queue
执行的任务放入到哪个队列
dispatch_block_t -> block
具体执行的任务
29.
异步添加事件,所有任务的执行顺序是随机的
30.dispatch_group_async用来监视一组block对象的完成,可以同步或异步地监视
- dispatch_group_notify所有任务执行结束汇总,不阻塞当前进程
- dispatch_group_wait等待直到所有任务执行结束,中途不能取消,阻塞当前进程
31.
dispatch_apply(size_t iterations, dispatch_queue_t queue, <#^(size_t)block#>)
其中:iterations:
遍历执行的次数;queue:
执行操作所在的队列;block:
执行的具体任务
32.
使用dispatch_apply执行效率比一般的for循环执行效率要高
33.Dispatch Semaphore(信号)
- Dispatch Semaphore是持有计数的信号
- Dispatch Semaphore使用计数来实现该信号功能
- 等待条件: 如果信号量>0,则不需要等待直接往下执行,但信号量-1, 如果信号量为0则等待
dispatch_semaphore_wait(semaphore,
DISPATCH_TIME_FOREVER);
- 发信号,使原来的信号量计数值+1
dispatch_semaphore_signal(semaphore);
深入理解iOS开发与Swift编程
本文详细介绍了iOS开发的基础知识及Swift编程语言的核心特性,包括界面设计、数据管理、网络请求、性能优化等方面,旨在帮助开发者提升iOS应用开发技能。

被折叠的 条评论
为什么被折叠?



