Comment libérer de la memory dans l'ARC pour le rendu graphique à haute utilisation de la memory?

Tout d'abord, merci à tout le monde sur ce site … il a été INCROYABLEMENT utile de se lancer dans la programmation iOS.

Mon numéro actuel:

J'ai une application qui rend une version très stylisée d'une photo. Il utilise certains filters CoreImage pour certains d'entre eux, mais a besoin d'un tas de CoreGraphics pour get le image processing lourde.

La taille du proxy rend le travail très bien, mais quand je rends une version de mon image en pleine résolution, il se bloque parfois à cause de l'utilisation de la memory. Le problème est que je dois être en mesure d'avoir plusieurs tampons de résolution complète (3264×2448) en memory lors du rendu. Je ne sais pas quoi ou comment libérer plus de memory. J'ai fait très attention à faire correspondre CGImageRelease partout où je peux.

Et avec ARC, comment savoir si quelque chose a vraiment été libéré et libéré? Mettre un object à zéro ne fait vraiment rien.

Et je doute que je puisse diffuser ceci sur disque de quelque façon que ce soit.

TOUTES les suggestions seraient extrêmement appréciées!

MERCI!

L'ARC ne fait pas de différence dans un tel context.

Cela signifie simplement que vous n'avez pas à appeler la release par vous-même.

Avec un non-ARC, dans des conditions de memory insuffisante, vous pouvez libérer certaines propriétés dont vous n'avez pas vraiment besoin (ce qui signifie qu'elles peuvent être recréées à la request).

 - ( void )didReceiveMemoryWarning: { [ _myProperty release ]; _myProperty = nil; [ super didReceiveMemoryWarning ]; } 

Sous ARC, c'est exactement la même chose, sauf que vous n'avez pas à appeler la release :

 - ( void )didReceiveMemoryWarning: { _myProperty = nil; [ super didReceiveMemoryWarning ]; } 

Définir votre propriété à nil sera, sous ARC, automatiquement relâché.
Donc, ça fait vraiment quelque chose.

Si ça ne marche pas pour vous, alors vous avez définitivement un autre problème.
Assurez-vous de ne pas avoir de memory leaks, ni de conserver les cycles .

Le dernier est certainement le problème …

Donc, comme cela a été suggéré (mais pas explicitement indiqué) – ce n'est pas un problème d'ARC.

Vous aurez besoin de 30 Mo de memory pour conserver une seule image dans la memory de cette résolution (3264×2448, en supposant 32 bits par pixel). Et bien que vous n'indiquiez pas le nombre de tampons de cette taille dont vous avez besoin en memory, il semblerait qu'il y en ait au less trois – vous en êtes à la limite de memory de nombreux appareils iOS (l'iPad original et l'iPhone 3GS ne totalisent que 256 Mo) De cela, vous pouvez seulement avoir access à un tiers.La memory disponible pour votre application est très variable).

ARC ne ressemble pas à la récupération de place – il ajoute simplement les instructions release et retain lors de la compilation. Si vous avez correctement structuré votre code, vos images seront libérées lorsqu'elles ne seront plus nécessaires. Je soupçonne fortement que si vous désactiviez ARC (ce que vous pouvez faire file par file, en utilisant un indicateur de compilation) vous obtiendriez les mêmes résultats.

Comme quelqu'un l'a déjà posté, le moyen de contourner cela est de coller votre image, et de travailler sur un petit échantillon à la fois. Si votre algorithm de flou ne peut pas faire face à cela, alors la dure vérité est que vous allez probablement devoir écrire celui qui le fait!

Vous devez carreler votre image et ne travailler que sur certaines parties à la fois. Vous pouvez le faire en créant votre CIImage et en appelant ensuite:

 [myContext drawImage:myImage atPoint:P fromRect:tileBounds]; 

dans une boucle et en changeant P et tileBounds afin que finalement il couvre toute la zone de l'image de sortie.