首页 > 代码库 > iOS中的多线程及GCD
iOS中的多线程及GCD
多线程中的一些概念
//任务:代码段 方法 线程就是执行这些任务
//NSThread类 创建线程 执行线程
[NSThread isMainThread]//判断是否是主线程
#import "AppDelegate.h"@implementation AppDelegate-(void)dealloc{ [_window release]; [super dealloc];}- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; // Override point for customization after application launch. self.window.backgroundColor = [UIColor whiteColor]; //实现多线程 //任务:代码段 方法 线程就是执行这些任务 //NSThread类 创建线程 执行线程 NSLog(@"-------------%d",[NSThread isMainThread]);//判断是否是主线程 //实现多线程的方式一 //使用 根类 NSObject 中的 performSelectorxxx方法 //UI的刷新一定要在主线程里进行 子线程刷新UI会异常 刷新不了 或者延迟刷新.// [self performSelectorInBackground:@selector(aa) withObject:nil]; //实现多线程的方式二 //使用 NSThread 类(多线程类) //创建一个线程 ,并让线程执行 self 的aa方法 //线程分两种 脱离线程 和 非脱离线程 //脱离线程;执行玩任务之后,自动销毁的线程 //非脱离线程 : 执行完任务之后 ,不会被销毁的线程,可以后续执行别的任务 //每一个线程都自带一个NSRunLoop对象,runloop默认是关闭的.一旦runloop开启,你的线程就会成为非脱离线程.runloop帮你轮询有没有新的任务分配到了这个线程里面 //[NSThread detachNewThreadSelector:@selector(aa) toTarget:self withObject:nil]; //创建一个线程,线程需要执行的任务是self 的aa 方法// NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(aa) object:nil];// [thread start];//开始执行线程 解决了延迟执行的问题 在想执行的时候执行 //第三种实现多线程的方式NSOperationQueue NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(aa) object:nil];// [op1 start]; NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"这是一个block operation"); }]; //线程同步就是串行 线程之间有依赖关系的时候使用同步 实现同步就把NSOperationQueue的MaxConcurrentOperationCount最大并发数为1 NSOperationQueue *queue = [[NSOperationQueue alloc] init];// NSLog(@"~~~~~~~~~~~~~~~~~~~~~~~~%d",queue.maxConcurrentOperationCount); [queue setMaxConcurrentOperationCount:1];//设置最大并发数为1 [queue addOperation:op1];//只需要把操作放到队列里即可,不需要人为调用start,queue会根据op的排队情况,帮你调用start .会智能帮为op安排线程 [queue addOperation:op2]; [self.window makeKeyAndVisible]; return YES;}- (void)aa{ //如果在子线程中执行任务 我们需要在任务里面加一个自动释放池 //因为.线程与线程之间是相互独立的,但是资源是共享的,共享堆 空间 ,如果一个线程开辟了空间 没有释放 其他线程也无法 使用这块已经开辟的空间 //尤其是当子线程里 大量使用便利构造器的时候 会导致很多堆空间无法回收内存 //线程共享堆 ,栈不共享 每个子线程默认以栈的大小是512k 主线程栈大小事1M 栈主要是放 局部变量的,局部变量出了方法就会被销毁,因此,尽管只有512k或着1M但是已经够用的了 ,,栈空间的大小必须是4k的整数倍 // @autoreleasepool { for (int i = 0; i<10; i++) { NSLog(@"%d",i); } NSLog(@"#################%d",[NSThread isMainThread]); [self performSelectorOnMainThread:@selector(bb) withObject:nil waitUntilDone:YES]; NSLog(@"子线程结束了"); }}- (void)bb{ @autoreleasepool { NSLog(@"??????????????????????%d",[NSThread isMainThread]); for (int i = 0; i<20; i++) { NSLog(@"-%d",i); } NSLog(@"刷新你的UI"); }}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。