你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發基礎 >> 我是如何檢測內存洩露的

我是如何檢測內存洩露的

編輯:IOS開發基礎

1458973781558646.jpg

在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便無所遁形了。然後按著如下寫腳本(代碼在文末):

  1. 遍歷工程裡面的所有.m文件

  2. 查找^

  3. 匹配後面的一對{}記住位置

  4. 查找{}裡面符合規則的self

  5. 調用mac的通知中心通知自己哪裡有問題

最終效果如下:

1458977425920371.png

想要調用mac的通知中心,首先需要pyobjc庫,安裝後腳本就可以正常運行了,需要設置的參數如下:

1.projectPath(工程所在路徑)

如:projectPath = "/Users/yuyang/Documents/techwolf/mobile_ios"

2.noPath(不檢測路徑)

如:noPath = ['ThirdLibs','iosTools']或:noPath = None(檢測工程下所有路徑)

如果這樣用你覺得用著麻煩(畢竟每次都要開著終端),那麼可以用炮筒機器人來減輕工作量,炮筒機器人是mac自帶的就是這個:

1458977606178029.png

首先打開它

1458977791411741.png

把它拖到右面的工作區,然後選擇python腳本

80.png

清除裡面的內容,把腳本的代碼拷貝進去,最後生成這個app:

1458977981606280.png

當然你也可以設置這個為開機啟動項。

運行時的效果這樣:

QQ截圖20160328161917.png

最後,奉上代碼: https://github.com/hades0918/CheckLeak,如果你覺得好用,給我個star鼓勵下,謝謝!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved