首页 > 代码库 > 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");    }}