之前一直使用NSTimer來做定時之類的任務,今天突然想使用一下更加靈活的的dispatch_source_create()創建一個timer源做一個任務,之后就遇到一個小問題,說是小問題但確實挺坑的。
第一次很隨意就手寫了如下代碼:
然后運行后神奇的問題就出現了,NSLog(@"dispatch_source_timer is executed");這句代碼死活就只執行一次,按上面的代碼來說不應該是每兩秒執行一次嗎?思前想后,把上述每個API也確切的研究了一番,確實沒有問題啊,最終恍然大悟,原來是_timer 不是一個全局變量或屬性,第一次運行完后,ARC就會把它釋放掉了,RunLoop 掃描不到這個timer了。所以如下操作就正常了。
但是同樣的代碼使用NSTimer確實可以正常使用的,這也許就是使用C語言Dispatch系列Api和Objective-c的Api在ARC下的區別吧