2010-09-08 13 views
0

Je suis reconnaissant d'utiliser la bibliothèque ZipArchive mais il semble qu'il y ait une fuite de mémoire. Je ne sais pas comment réparer ça - c'est écrit en C et je ne suis pas familier avec ça. Ma question est - est-il possible d'autoelease la ligne s = (unz_s *) ALLOC (sizeof (unz_s)); comme vous le feriez en Objective-C dans ce scénario?Problème de fuite de mémoire iPhone dans ZipArchive lib

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; 
    } 

Voici une capture d'écran de l'emplacement de la fuite pour plus de clarté:

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

Quelqu'un peut-il pourrait faire la lumière sur la façon dont je pourrais résoudre ce problème? Merci.

Répondre

2

J'ai fait face au même problème et Résolu en lisant certains des blogs. il semble simple,
fermer votre objet ZipArchive avant relesing Objet
son look comme
[ZipObj UnzipCloseFile];

+0

merci! c'est bien! et travaille pour moi. –

0

Non, vous ne pouvez pas le libérer. Autoreleasing n'est disponible que pour les objets Objective-C. Vous avez donc 2 options:

  1. Libérez-vous de la mémoire en utilisant free().
  2. Enveloppez l'objet s dans un NSData en utilisant dataWithBytesNoCopy:length:, qui prendra en charge les données allouées et le libérera lorsque l'objet NSData sera désalloué.

Option 2 ressemblerait à quelque chose comme ceci:

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

Puis, quand boxedS est détruit, il libérera s aussi bien.

+0

Thankyou, mais il fuit encore en dépit d'une tentative de solution. Le produit ALLOCated de unzOpen2 est affecté directement à une variable d'instance de membre de classe privée comme dans la classe d'utilisation: _unzFile = unzOpen ((const char *) [zipFile UTF8String]); Ainsi, dans la méthode dealloc de classe je publie comme ceci: if (_unzFile! = NULL) { \t \t libre (_unzFile); Je ne voulais pas descendre la route de contenir l'objet C dans un objet NSData * car il y a beaucoup de références à la variable d'instance _unzFile: je serais plus loin de ma profondeur avec la langue fusion ici! – Kzrbill