標籤: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"); }}