[iOS] dataWithBytes*引起的內存泄漏問題 – iPhone手機開發技術文章 iPhone軟體開發教學課程

今天晚上被dataWithBytes引起內存泄漏的問題弄得一個頭兩個大,回來後又想瞭一下,問題似乎不出在dataWithBytes本身。
大致情況是這樣:
在while裡面處理接收到的視頻數據,將Binary Data存到bytes buffer中去,再通過dataWithBytes生成一個NSData對象,最後再轉成UIImage呈現出來。
最初是用:
+ (id)dataWithBytes:(const void *)bytes length:(NSUInteger)length
然後知道有:

+ (id)dataWithBytesNoCopy:(void *)bytes length:(NSUInteger)length
但發現在我結束while後出現:
“Pointer being freed was not allocated”

晚上回來,再次Google & DDG,想到幾點:

while中使用dataWithBytes,會生成很多NSData對象,並且每個對象都擁有一份length長度的bytes buffer,我以為有ARC,它會被Auto Release掉,我一定是哪裡弄錯瞭!疑問在while中用dataWithBytesNoCopy時,傳遞進去的bytes雖然內容在變,但從未被free或delete,根據Stack Overflow上其它開發者的解答(https://stackoverflow.com/questions/11987045/cant-copy-with-nsdatadatawithbytesnocopy)來看:”If
you give raw data to NSData, the NSData object is really only valid while that data is valid.”。那麼每調用一次dataWithBytesNoCopy就生成一個NSData對象,雖然沒有像dataWithBytes那樣生成自帶bytes buffer的NSData,但應該是生成瞭很多個NSData對象,並且都因為bytes還活著,它們都存活下來,浪費著稀少的memory。最後當退出while時,一個NSData被Release掉(為什麼現在才釋放掉呢?),於是乎bytes也被順帶給Release掉瞭,下一個NSData被Release時,想釋放bytes,但bytes已被Free掉,所以出現瞭Double
Free的錯誤。似乎需要先free掉bytes buffer,才能避免生成很多的NSData對象,這樣,需要再次生成新的NSData時,重新malloc一個bytes buffer傳遞進去。
順帶知道有dataWithBytesNoCopy帶freeWhenDone參數,來關掉順帶釋放bytes的動作,聽說可以解決Double Free的問題,明天嘗試一下。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *