1、NSObject的多線程方法(用的時候要用@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秒
特色:
使用簡單,量級輕
不能控制線程的數量以及執行順序
2、NSObject的多線程方法注意事項
NSObject的多線程方法使用的是NSThread的多線程技術。
而NSThread的多線程技術不會自動使用@autoreleasepool。
在使用NSObject或NSThread的多線程技術時,若是涉及到對象分配,須要手動添加@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{}包起來。