iOS開發之NSObject的多線程

1NSObject的多線程方法用的時候要用@autoreleasepool{}包起來面試

開啓後臺執行任務的方法:多線程

- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg.net

蘋果底層容許使用performSelectorInBackground方法在後臺線程更新UI,強烈不建議這麼作!線程

 

在後臺線程中通知主線程執行任務的方法:orm

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

wait參數:內存

YES:會阻塞住線程,直到調用方法完成作用域

NO:不會阻塞線程,主線程其餘任務會繼續執行開發

 

獲取線程信息:get

[NSThread currentThread]

 

線程休眠:

[NSThread sleepForTimeInterval:2.0f];

設置線程休眠了2秒

 

特色:

使用簡單,量級輕

不能控制線程的數量以及執行順序

2NSObject的多線程方法注意事項

NSObject的多線程方法使用的是NSThread的多線程技術。

而NSThread的多線程技術不會自動使用@autoreleasepool。

在使用NSObjectNSThread的多線程技術時,若是涉及到對象分配,須要手動添加@autoreleasepool

3@autoreleasepool

iOS開發中的內存管理:

(1) 在iOS開發中,並無JAVA或C#中的垃圾回收機制

(2) 使用ARC開發,只是在編譯時,編譯器會根據代碼結構自動添加了retain、release和autorelease

自動釋放池的工做原理:

(1)標記爲autorelease的對象在出了做用域範圍後,會被添加到最近一次建立的自動釋放池中

(2)當自動釋放池被銷燬或耗盡時,會向自動釋放池中的全部對象發送release消息

(3)每一個線程都須要有@autoreleasepool ,不然可能會出現內存泄漏,可是使用NSThread多線程技術,並不會爲後臺線程建立自動釋放池

4、自動釋放池常見面試代碼

for (int i = 0; i < 10; ++i) {

    NSString *str = @"Hello World";

    str = [str stringByAppendingFormat:@" - %d", i];

    str = [str uppercaseString];

    NSLog(@"%@", str);

}

問:以上代碼存在什麼樣的問題?若是循環的次數很是大時,應該如何修改?

答:循環建立了NSString對象,循環次數過多容易致使內存泄漏。若是循環次數比較大,能夠用@autoreleasepool{}把整個循環包起來,若是每一次循環都會致使內存泄漏,則把循環內容用@autoreleasepool{}包起來。

相關文章
相關標籤/搜索