中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

IOS如何創建并發線程

發布時間:2021-07-09 09:36:20 來源:億速云 閱讀:204 作者:小新 欄目:移動開發

這篇文章給大家分享的是有關IOS如何創建并發線程的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

創建并發線程

       主線程一般都是處理UI界面及用戶交互的事兒的。其他的事一般就要另外的線程去處理,如下載,計算等。。。
現在先簡單創建3個線程,分別打印出1-1000,,為了方便,線程3就放在主線程中執行。

- (void) firstCounter{  
@autoreleasepool {  
NSUInteger counter = 0;  
for (counter = 0;  
counter < 1000;  
counter++){  
NSLog(@"First Counter = %lu", (unsigned long)counter);  
}  
}  
}
- (void) secondCounter{  
@autoreleasepool {  
NSUInteger counter = 0;  
 
for (counter = 0;  
counter < 1000;  
counter++){  
NSLog(@"Second Counter = %lu", (unsigned long)counter);  
}  
}  
}
- (void) thirdCounter{  
NSUInteger counter = 0;  
for (counter = 0;  
counter < 1000;  
counter++){  
NSLog(@"Third Counter = %lu", (unsigned long)counter);  
}  
}
- (void)viewDidLoad {  
[super viewDidLoad];  
[NSThread detachNewThreadSelector:@selector(firstCounter)  
toTarget:self  
withObject:nil];  
[NSThread detachNewThreadSelector:@selector(secondCounter)  
toTarget:self  
withObject:nil];  
/* Run this on the main thread */  
[self thirdCounter];  
}

       由于thirdCounter 函數沒有運行在單獨的線程中,所以不需要自動釋放池(autorelease pool)。這個方法將在應用程序的主線程中運行,每一個Cocoa Touch程序都會自
動的給該主線程創建一個自動釋放池。  

       在代碼的最后通過調用 detachNewThreadSelector,把將第一個計數器和第二個計數器運行在獨立的線程中。現在,如果你運行程序,將會在控制臺窗口看到如下信息:

 Second Counter = 921 
Third Counter = 301 
Second Counter = 922 
Second Counter = 923 
Second Counter = 924 
First Counter = 956 
Second Counter = 925 
Counter = 957 
Second Counter = 926 
First Counter = 958 
Third Counter = 302 
Second Counter = 927 
Third Counter = 303 
Second Counter = 928

       可以看出,這三個計時器是同時運行的,他們輸出的內容是隨機交替的。 每一個線程必須創建一個 autorelease pool。在 autorelease pool 被 release 之前,autorelease pool 會一直持有被 autoreleased 的對象的引用。在引用計數內存管理環境中這是一個非常重要的機制,例如Cocoa Touch中的對象就能夠被autoreleased。無論何時,在創建一個對象實例時,該對象的引用計數是1,但是當創建的autorelease pool對象被release了,那么 autorelease 的對象同樣會發送一個 release 消息,如果此時,它的引用計數仍然是 1,那么該對象將被銷毀。 

        每一個線程都需要創建一個 autorelease pool,當做是該線程第一個被創建的對象。如果不這樣做,如果不這樣做,當線程退出的時候,你分配在線程中的對象會發生內存泄露。為了更好的理解,我們來看看下面的代碼: 

- (void) autoreleaseThread:(id)paramSender{  
NSBundle *mainBundle = [NSBundle mainBundle];  
NSString *filePath = [mainBundle pathForResource:@"AnImage"  
ofType:@"png"];  
UIImage *image = [UIImage imageWithContentsOfFile:filePath];  
/* Do something with the image */  
NSLog(@"Image = %@", image);  
}  
- (void)viewDidLoad {  
[super viewDidLoad];  
[NSThread detachNewThreadSelector:@selector(autoreleaseThread:)  
toTarget:self  
withObject:self];  
}  
如果你運行這段代碼,,你就會在控制臺窗口看到這樣的輸出信息:
*** __NSAutoreleaseNoPool(): Object 0x5b2c990 of 
class NSCFString autoreleased with no pool in place - just leaking 
*** __NSAutoreleaseNoPool(): Object 0x5b2ca30 of 
class NSPathStore2 autoreleased with no pool in place - just leaking 
*** __NSAutoreleaseNoPool(): Object 0x5b205c0 of 
class NSPathStore2 autoreleased with no pool in place - just leaking 
*** __NSAutoreleaseNoPool(): Object 0x5b2d650 of 
class UIImage autoreleased with no pool in place - just leaking

      上面的信息顯示了我們創建的 autorelease 的 UIImage 實例產生了一個內存泄露,另外,FilePath 和其他的對象也產生了泄露。這是因為在我們的線程中,沒有在開始的時候創建和初始化一個autorelease pool。下面是正確的代碼,你可以測試一下,確保它沒有內存泄露:

- (void) autoreleaseThread:(id)paramSender{  
@autoreleasepool {  
NSBundle *mainBundle = [NSBundle mainBundle];  
NSString *filePath = [mainBundle pathForResource:@"AnImage"  
ofType:@"png"];  
UIImage *image = [UIImage imageWithContentsOfFile:filePath];  
/* Do something with the image */  
NSLog(@"Image = %@", image);  
}  
}

感謝各位的閱讀!關于“IOS如何創建并發線程”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

ios
AI

五台县| 博野县| 尤溪县| 桑日县| 彭水| 洛川县| 富平县| 琼海市| 五华县| 寿宁县| 家居| 屯昌县| 永顺县| 东光县| 咸丰县| 凉山| 新乐市| 登封市| 云龙县| 桃园县| 荆门市| 蓬安县| 通渭县| 临泽县| 应用必备| 吉林省| 绥化市| 新民市| 清流县| 莒南县| 江山市| 靖宇县| 五大连池市| 开江县| 淄博市| 梁山县| 社会| 阳东县| 遂昌县| 黔江区| 北安市|