2010-09-08 31 views
0

我很感激地使用ZipArchive庫,但似乎有內存泄漏。我不知道如何解決這個問題 - 它是用C編寫的,我不熟悉它。我的問題是 - 是否可以自動釋放行s =(unz_s *)ALLOC(sizeof(unz_s));就像你在這種情況下在Objective-C中所做的那樣?ZipArchive庫中的iPhone內存泄漏問題

extern unzFile ZEXPORT unzOpen2 (path, pzlib_filefunc_def) 
     const char *path; 
     zlib_filefunc_def* pzlib_filefunc_def; 
    { 

     // ... 

     s=(unz_s*)ALLOC(sizeof(unz_s)); 
     *s=us; 
     unzGoToFirstFile((unzFile)s); 
     return (unzFile)s; 
    } 

這裏是泄漏了清晰的位置的屏幕抓取:

http://ziparchive.googlecode.com/issues/attachment?aid=-5463964192517894688&name=Screen+shot+2010-08-20+at+8.12.58+PM.png&token=8c66aa58a4826b99ba157903fbae83bb&inline=1

可有人能闡明我怎麼可能解決這個問題的一些輕?謝謝。

回答

2

我遇到了同樣的問題,並通過閱讀一些博客解決。它似乎簡單
關閉ZipArchive對象relesing對象
它看起來像
[ZipObj UnzipCloseFile];

+0

謝謝!這很棒!併爲我工作。 – 2012-05-28 13:07:02

0

不,你不能自動釋放它。自動釋放僅適用於Objective-C對象。所以你有兩個選擇:

  1. 你自己使用free()釋放記憶。
  2. 使用dataWithBytesNoCopy:length:s東西包裝爲NSData,它將獲取分配數據的所有權,並在解除分配NSData對象時釋放它。

選項2會是這個樣子:

unz_s * s = unzOpen2(...); 
NSData * boxedS = [NSData dataWithBytesNoCopy:s length:sizeof(unz_s)]; 

然後當boxedS被破壞,它會釋放s爲好。

+0

三江源之前,但它仍然不顧企圖修復泄漏。 unzOpen2的ALLOCated產品直接分配給私有類成員實例變量,就像在利用類中那樣: _unzFile = unzOpen((const char *)[zipFile UTF8String]); 所以在類的dealloc方法我放開了它這樣的: 如果(_unzFile!= NULL){ \t \t免費(_unzFile); \t} \t 我不想在NSData *對象中包含C對象的路由,因爲有很多對實例變量的引用_unzFile:我會更加深入地用languange融合在這裏! – Kzrbill 2010-09-13 18:15:22