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 setMaxConcurrentOperatio 二、NSThread<轉(zhuǎn)>
一、線程創(chuàng)建與啟動(dò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;
二、線程的同步與鎖 // 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)applicationDidFinishLaun
三、線程的交互 - (void)performSelectorOnMainThr
由于在本過(guò)程中,可能需要釋放一些資源,則需要使用NSAutoreleasePool來(lái)進(jìn)行管理,如: - (void)startTheBackgroundJob { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init]; // to do something in your thread job ... [self performSelectorOnMainThr
如果你什么都不考慮,在線程函數(shù)內(nèi)調(diào)用 autorelease 、那么會(huì)出現(xiàn)下面的錯(cuò)誤: |
|
來(lái)自: 求知665 > 《ios有用網(wǎng)頁(yè)》