小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

ios 多線程

 求知665 2014-10-14
iPhone 中的線程應(yīng)用并不是無(wú)節(jié)制的,官方給出的資料顯示iPhone OS下的主線程的堆棧大小是1M,第二個(gè)線程開(kāi)始都是512KB。并且該值不能通過(guò)編譯器開(kāi)關(guān)或線程API函數(shù)來(lái)更改。

  只有主線程有直接修改UI的能力。

一、NSOperation和NSOperationQueue

  1、一個(gè)繼承自 NSOperation的操作類,該類的實(shí)現(xiàn)中必須有- (void)main方法的。

  2、使用NSOperation的最簡(jiǎn)單方法就是將其放入NSOperationQueue中。

    一旦一個(gè)操作被加入隊(duì)列,該隊(duì)列就會(huì)啟動(dòng)并開(kāi)始處理它(即調(diào)用該操作類的main方法)。一旦該操作完成隊(duì)列就會(huì)釋放它。

     self.queue = [[NSOperationQueue alloc] init];

  ArticleParseOperation *parser = [[ArticleParseOperation alloc] initWithData:filePathdelegate:self];

  [queue addOperation:parser];

  [parser release];

     [queue release];

  3、可以給操作隊(duì)列設(shè)置最多同事運(yùn)行的操作數(shù): [queue setMaxConcurrentOperationCount:2];

二、NSThread<轉(zhuǎn)>

一、線程創(chuàng)建與啟動(dòng)
線程創(chuàng)建主要有二種方式:

- (id)init; // designated initializer - (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument;

當(dāng)然,還有一種比較特殊,就是使用所謂的convenient method,這個(gè)方法可以直接生成一個(gè)線程并啟動(dòng)它,而且無(wú)需為線程的清理負(fù)責(zé)。這個(gè)方法的接口是:

+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument

前兩種方法創(chuàng)建后,需要手機(jī)啟動(dòng),啟動(dòng)的方法是:

- (void)start;

二、線程的同步與鎖
要說(shuō)明線程的同步與鎖,最好的例子可能就是多個(gè)窗口同時(shí)售票的售票系統(tǒng)了。我們知道在java中,使用synchronized來(lái)同步,而iphone雖然沒(méi)有提供類似java下的synchronized關(guān)鍵字,但提供了NSCondition對(duì)象接口。查看NSCondition的接口說(shuō)明可以看出,NSCondition是iphone下的鎖對(duì)象,所以我們可以使用NSCondition實(shí)現(xiàn)iphone中的線程安全。這是來(lái)源于網(wǎng)上的一個(gè)例子:
SellTicketsAppDelegate.h 文件

// SellTicketsAppDelegate.h import <UIKit/UIKit.h> @interface SellTicketsAppDelegate :NSObject <UIApplicationDelegate> { int tickets; int count; NSThread* ticketsThreadone;NSThread* ticketsThreadtwo; NSCondition* ticketsCondition; UIWindow *window; }@property (nonatomic, retain) IBOutlet UIWindow *window; @end

SellTicketsAppDelegate.m 文件

// SellTicketsAppDelegate.m import "SellTicketsAppDelegate.h" @implementation SellTicketsAppDelegate @synthesize window; - (void)applicationDidFinishLaunching:(UIApplication *)application { tickets = 100; count = 0; // 鎖對(duì)象ticketCondition = [[NSCondition alloc] init]; ticketsThreadone = [[NSThread alloc]initWithTarget:self selector:@selector(run) object:nil]; [ticketsThreadone setName:@"Thread-1"]; [ticketsThreadone start]; ticketsThreadtwo = [[NSThread alloc]initWithTarget:self selector:@selector(run) object:nil]; [ticketsThreadtwo setName:@"Thread-2"]; [ticketsThreadtwo start]; //[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil]; // Override point for customization after application launch [window makeKeyAndVisible]; } -(void)run{ while (TRUE) { // 上鎖 [ticketsCondition lock]; if(tickets > 0){ [NSThread sleepForTimeInterval:0.5]; count = 100 - tickets; NSLog(@"當(dāng)前票數(shù)是:%d,售出:%d,線程名:%@",tickets,count,[[NSThread currentThread] name]); tickets--; }else{ break; }[ticketsCondition unlock]; } } - (void)dealloc { [ticketsThreadone release];[ticketsThreadtwo release]; [ticketsCondition release]; [window release]; [super dealloc]; } @end

三、線程的交互
線程在運(yùn)行過(guò)程中,可能需要與其它線程進(jìn)行通信,如在主線程中修改界面等等,可以使用如下接口:

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait

由于在本過(guò)程中,可能需要釋放一些資源,則需要使用NSAutoreleasePool來(lái)進(jìn)行管理,如:

- (void)startTheBackgroundJob { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init]; // to do something in your thread job ... [self performSelectorOnMainThread:@selector(makeMyProgressBarMoving) withObject:nil waitUntilDone:NO]; [pool release]; }

如果你什么都不考慮,在線程函數(shù)內(nèi)調(diào)用 autorelease 、那么會(huì)出現(xiàn)下面的錯(cuò)誤:
NSAutoReleaseNoPool(): Object 0x********* of class NSConreteData autoreleased with no pool in place ….

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多