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