在iOS開發中我們經常用到block,無論是GCD還是參數傳遞,block都是一個很不錯的選擇。然而有利也有弊,block會產生循環引用,但是這代碼通常不會報錯,只是運行結果不正確!於是花費大量時間打斷點調試,發現原來問題在這裡:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)),dispatch_get_main_queue(), ^{ self.view.backgroundColor = [UIColor redColor]; });
這裡的block中用了self,導致viewcontroller不能調dealloc,每次被這個坑了的時候,內心都幾乎是崩潰的...... 於是寫了個腳本來檢測這個問題,效果大大的好。
以下是正題
block長什麼樣?它大概長這樣子:一個^後面有{和},介於此我們就能查到幾乎所有代碼裡面的block了,那麼block裡面的self怎麼識別?weakSelf算嗎,當然不算,按照語法:如果一個self字段它的前後都不是字母數字下劃線(好好理解下這句話),那它就是我們要找的self。按著這個思路block裡面的self便無所遁形了。然後按著如下寫腳本(代碼在文末):
遍歷工程裡面的所有.m文件
查找^
匹配後面的一對{}記住位置
查找{}裡面符合規則的self
調用mac的通知中心通知自己哪裡有問題
最終效果如下:
想要調用mac的通知中心,首先需要pyobjc庫,安裝後腳本就可以正常運行了,需要設置的參數如下:
1.projectPath(工程所在路徑)
如:projectPath = "/Users/yuyang/Documents/techwolf/mobile_ios"
2.noPath(不檢測路徑)
如:noPath = ['ThirdLibs','iosTools']或:noPath = None(檢測工程下所有路徑)
如果這樣用你覺得用著麻煩(畢竟每次都要開著終端),那麼可以用炮筒機器人來減輕工作量,炮筒機器人是mac自帶的就是這個:
首先打開它
把它拖到右面的工作區,然後選擇python腳本
清除裡面的內容,把腳本的代碼拷貝進去,最後生成這個app:
當然你也可以設置這個為開機啟動項。
運行時的效果這樣:
最後,奉上代碼: https://github.com/hades0918/CheckLeak,如果你覺得好用,給我個star鼓勵下,謝謝!