天天看點

iOS開發之NSObject的多線程

1、nsobject的多線程方法(用的時候要用@autoreleasepool{}包起來)

開啟背景執行任務的方法:

- (void)performselectorinbackground:(sel)aselector withobject:(id)arg

蘋果底層允許使用performselectorinbackground方法在背景線程更新ui,強烈不建議這麼做!

在背景線程中通知主線程執行任務的方法:

- (void)performselectoronmainthread:(sel)aselector withobject:(id)arg waituntildone:(bool)wait

wait參數:

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

no:不會阻塞線程,主線程其他任務會繼續執行

擷取線程資訊:

[nsthread currentthread]

線程休眠:

[nsthread sleepfortimeinterval:2.0f];

設定線程休眠了2秒

特點:

使用簡單,量級輕

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

2、nsobject的多線程方法注意事項

nsobject的多線程方法使用的是nsthread的多線程技術。

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

ios開發中的記憶體管理:

(1) 在ios開發中,并沒有java或c#中的垃圾回收機制

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

自動釋放池的工作原理:

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

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

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{}包起來。

繼續閱讀