Crash CGImageRef vm_copy failed
Hello,
Encore des soucis... Erreur non reproductible 2 fois de suite bien évidemment sinon ça serait pas drôle
En gros, je décode une image au format WebP ce qui se passe correctement dans 90% des cas mais y'a toujours ces 10% de crash que je n'arrive pas à gérer.
Erreur:
2019-05-09 14:39:28.736662+0200 Librairie[10986:2143340] [org.oucho.Librairie] copy_read_only: vm_copy failed: status 1.
Ligne ou ça crash:
https://github.com/Old-Geek/Librairie/blob/master/Librairie/Image/NSData+WebP.m#L59
J'ai bien tenté un try catch pour contourner le problème mais ça ne fonctionne pas.
Une idée ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Ca ressemble à un problème d'alignement mémoire (doc vm_copy concernant source_address et dest_address)
C'est aussi ce que j'avais trouvé mais les solutions proposé n'ont rien résolu.
En mettant WebPFreeDecBuffer(&config.output); après CGImageRef cgImage = ... au lieu d'avant a réglé le problème.
Résolu.
Merci
Mouaip, en faisant ça ça me bouffe toute ma RAM... avec un seul dossier lu contenant des fichiers WebP au lieu de rester à 25Mo d'occupation je passe à 650Mo.
Si je passe en revue tout mes répertoire je passe à plus de 20Go de ram occupé
penser à rajouter un CGImageRelease(cgImage);
Peut-être, j'ai trouvé pourquoi ça bouffe la memoire. Dans FolderView.m, tu as une boucle qui appelle
[[Comic alloc] initWithFullPath:path]
. Ce qui appelle, à son tour,decodeWebP
, où se trouve le crash.Avec ce type de boucle, tu devrais penser d'utiliser NSAutoReleasePool
En fait c'était le CGImage qui bouffait la RAM, le CGImageRelease à résolu le problème. Ca me maintient l'occupation de la RAM à 25-35Mo max.
Par contre j'en suis à me demander si @autoreleasepool a encore son utilité, partout ou je l'ai testé ça n'a absolument rien changé.
On a au moins un autorelease pool à tout moment dans une appli.
En créer un autre se justifie quand on crée un grand nombre d'objet (disons >10 000) qui ont une durée de vie courte. Typiquement, ça sert pour effectuer un traitement lourd, puis relâcher la mémoire juste après.
On parle bien d'allocation d'objets (NSObject), donc effectivement, ça n'aura aucune incidence sur la gestion mémoire de CoreGraphics.
Sauf exception, tout ce qui commence en
CF
ouCG
et qui finit parRef
n'est pas managé par l'ARC. Tu dois donc faire le release toi-même. Comme les pointeurs en C.Merci pour les infos, c'est bon à savoir.
On trouve des choses intéressante en fouinant dans les SDK.
Pour ma Queue qui s'occupe du décodage de mes imgs -> DISPATCH_QUEUE_CONCURRENT_WITH_AUTORELEASE_POOL
error
Bon à savoir - merci Pyroh !