iOS中的多線程及GCD

來源:互聯網
上載者:User

標籤:style   blog   color   使用   os   io   for   art   

多線程中的一些概念

    //任務:程式碼片段  方法  線程就是執行這些任務

    //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個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.