→ HuangJC: updateThread 是個內部有 while loop 的 thread 11/03 01:36
→ HuangJC: 因此如果不結束它,應該是會浪費系統資源;我用一個變數 11/03 01:37
→ HuangJC: 來管理它的生命週期;然後在 unlock 那行設中斷點,想檢 11/03 01:37
→ HuangJC: 查 while loop 有沒有如我預期的結束;結果都等不到.. 11/03 01:38
→ atst2: mQuitThread 在dealloc中才改變,等不到是正常的. 11/03 02:14
→ HuangJC: 為什麼?因為我 create 的 queue 會自己先結束? 11/03 04:57
→ HuangJC: 有這一段的說明文件嗎? 11/03 04:57
→ atst2: 去檢查一下mQuitThread在那裡會改變吧. 11/03 09:35
→ atst2: 從你公開的內容中, mQuitThread只在dealloc 會變動. 11/03 09:35
→ atst2: 如果dealloc一直沒被呼叫到, 把中斷點設在迴圈外有用嗎? 11/03 09:36
我寫了一小段程式來測這個現象
程式非常小,以避免檢查不完的 reference
TestView* view;
view = [TestView new];
view = nil; // dealloc soon
view = [[NSBundle mainBundle] loadNibNamed:@"TestView" owner:nil options:nil][0];
view = nil; // dealloc later
view = [[NSBundle mainBundle] loadNibNamed:@"TestView" owner:nil options:nil][0];
view = nil; // dealloc later
TestView.xib 很簡單,new 出來後就指定唯一的 view 是 TestView 這個 class
然後用 nslog 監視 TestView 的 dealloc
上面程式的測試結果,dealloc soon 的就是馬上釋放
later 的就不是了,當下沒釋放,但程式最後完全退出前是有釋放的
光以這部份程式來說,既然'最後有釋放'那也就算了
雖然我不知道它用什麼機制
但在我其他專案中,這可有困擾了
因為我在 view 中產生了一個 thread,用 while loop 維持
於是我真的維持了 n 個多餘的 thread... Orz
幸好我有寫 wait,把 thread 停掉了
但如果我沒寫 wait,經測試,那些 thread 的確都活跳跳的
所以我可能不該依賴系統幫我找的時機...
※ 編輯: HuangJC (60.251.197.63), 11/03/2014 13:17:52
查到原因了
當元件內部再產生的 thread 沒結束時,元件就不會結束
所以根本就是這個 thread 和元件在互等
解決方法是把 while loop 拆掉,還原成一次性的 update
而每次 setDitry 時,都重新開始一個 thread
※ 編輯: HuangJC (60.251.197.63), 11/03/2014 21:17:39