标签:
1.创建线程是有开销的,iOS下主要成本包括:内核数据结构(大约1KB)、栈空 间(子线程512KB、主线程1MB,也可以使用-setStackSize:设置,但必须是4K 的倍数,而且最小是16K),创建线程大约需要90毫秒的创建时间 。
2.主线程的使用注意
● 别将比较耗时的操作放到主线程中
● 耗时操作会卡住主线程,严重影响UI的流畅度,给用户一种“卡”的坏体验
3.pthread
4.NSThread
三种方式创建:
一.
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
[thread start];
这里的thread是局部变量。。不会在}的时候立刻销毁。。而是在子线程程序运行完成的时候自动销毁;
二.
[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
三.
[self performSelectorInBackground:@selector(run:) withObject:nil];
主线程相关用法:
+ (NSThread *)mainThread; // 获得主线程
- (BOOL)isMainThread; // 是否为主线程
+ (BOOL)isMainThread; // 是否为主线程
5.安全隐患解决 – 互斥锁
● 互斥锁使用格式
@synchronized(锁对象) { // 需要锁定的代码 }
注意:锁定1份代码只用1把锁,用多把锁是无效的
● 互斥锁的优缺点
● 优点:能有效防止因多线程抢夺资源造成的数据安全问题
● 缺点:需要消耗大量的CPU资源
● 互斥锁的使用前提:多条线程抢夺同一块资源
● 相关专业术语:线程同步
● 线程同步的意思是:多条线程在同一条线上执行(按顺序地执行任务)
● 互斥锁,就是使用了线程同步技术
6.原子和非原子属性
● OC在定义属性时有nonatomic和atomic两种选择
● atomic:原子属性,为setter方法加锁(默认就是atomic)
● nonatomic:非原子属性,不会为setter方法加锁
7.线程间通信
● 线程间通信常用方法
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;
8.计算哪个步骤耗时多少
CFTimeInterval begin = CFAbsoluteTimeGetCurrent();
// 根据图片的网络路径去下载图片数据
NSData *data = [NSData dataWithContentsOfURL:url];
CFTimeInterval end = CFAbsoluteTimeGetCurrent();
NSLog(@"%f", end - begin);
9.imageView回归主线程设置图片方法
// 回到主线程,显示图片
[self.imageView performSelector:@selector(setImage:) onThread:[NSThread mainThread] withObject:image waitUntilDone:NO];
[self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];
10.gcd
一.创建一个并发队列
dispatch_queue_t queue = dispatch_queue_create("com.queue", DISPATCH_QUEUE_CONCURRENT);
获得全局的并发队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
二.创建串行队列
dispatch_queue_t queue = dispatch_queue_create("com.queue", DISPATCH_QUEUE_SERIAL);
获得主队列
dispatch_queue_t queue = dispatch_get_main_queue();
注意点:同一个串行队列不能嵌套同步,比如:
- (void)syncMain
{
NSLog(@"syncMain ----- begin");
// 1.获得主队列
dispatch_queue_t queue = dispatch_get_main_queue();
// 2.将任务加入队列
dispatch_sync(queue, ^{
NSLog(@"1-----%@", [NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"2-----%@", [NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"3-----%@", [NSThread currentThread]);
});
NSLog(@"syncMain ----- end");
}
这样写,(如果syncMain在子线程执行久不会卡死,否则)程序会卡死。
再比如:
// 1.创建串行队列
dispatch_queue_t queue = dispatch_queue_create("com.queue", DISPATCH_QUEUE_SERIAL);
// 2.将任务加入队列
dispatch_sync(queue, ^{
NSLog(@"1-----%@", [NSThread currentThread]);
dispatch_sync(queue, ^{
NSLog(@"2-----%@", [NSThread currentThread]);
});
});
这样写,程序也会卡死。
标签:
原文地址:http://www.cnblogs.com/jingdizhiwa/p/5539419.html