【问题标题】:iPhone memory leak issue in ZipArchive libZipArchive 库中的 iPhone 内存泄漏问题
【发布时间】:2010-09-08 17:51:28
【问题描述】:

我很感激使用 ZipArchive 库,但似乎存在内存泄漏。我不知道如何解决这个问题——它是用 C 语言编写的,我不熟悉它。我的问题是 - 是否可以自动释放行 s=(unz_s*)ALLOC(sizeof(unz_s));就像在这种情况下使用 Objective-C 一样?

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

任何人都可以阐明我如何解决这个问题吗?谢谢。

【问题讨论】:

    标签: iphone ziparchive


    【解决方案1】:

    我遇到了同样的问题,并通过阅读一些博客解决了。看起来很简单
    在释放对象之前关闭您的 ZipArchive 对象
    它看起来像
    [ZipObj UnzipCloseFile];

    【讨论】:

      【解决方案2】:

      不,您不能自动释放它。自动释放仅适用于 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

      【讨论】:

      • 谢谢,尽管尝试修复它仍然泄漏。 unzOpen2 的 ALLOCated 乘积被直接分配给私有类成员实例变量,就像在使用类中一样:_unzFile = unzOpen( (const char*)[zipFile UTF8String]);所以在类的 dealloc 方法中,我像这样发布它: if (_unzFile != NULL){ free(_unzFile);我不想走在 NSData* 对象中包含 C 对象的路线,因为有很多对实例变量 _unzFile 的引用:我会在此处使用语言融合进一步超出我的深度!跨度>
      猜你喜欢
      • 2011-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多