Est-il un moyen de vider le cache utilisé par UIImage classe?
Il est bien connu que UIImage cache les données d'image lorsque l'image est chargée à l'aide de la imageNamed:
méthode.
De la documentation d'apple:
https://developer.apple.com/documentation/uikit/uiimage/1624146-imagenamed
imageNamed:
Discussion: Cette méthode ressemble à la
système de cache pour une image de l'objet avec
le nom spécifié et retourne que
objet, si elle existe. Si une correspondance
l'image de l'objet n'est pas déjà dans le
cache, cette méthode de charger l'image
données à partir du fichier spécifié, caches
il, puis renvoie la qui en résulte
objet.
À cause de cela, après le chargement de plusieurs images avec imageNamed:
j'ai remarqué une forte augmentation de l'utilisation de la mémoire et aussi que la mémoire a été conservée dans de l'utiliser même après que le contrôleur qui a chargé les images dealloc. (au moins, il n'a pas augmenté à nouveau quand je alloc le même contrôleur)
Qui m'a fait me demander si il existe un moyen de vider le cache utilisé par UIImage par programme à un moment donné de ma vie de l'application, voire de contrôler certains paramètres de cache (comme la quantité maximale de mémoire qu'il peut utiliser, par exemple)
Je sais que je pourrais facilement résoudre ce problème en utilisant initWithData
, imageWithData
, imageWithContentsOfFile
ou de tout autre initialiseur au lieu de imageNamed
, mais ce comportement du cache est souhaitée lors de l'utilisation de plusieurs images, comme l'intérieur d'un UITableView
.
Toute réflexion sur la façon de le réaliser?
EDIT:
Après quelques réponses, je tiens juste à préciser qu'il y a un énorme fossé entre la nécessité de faire quelque chose et d'avoir la possibilité de faire quelque chose. Comme je l'ai souligné, je sais que l'OS prend soin de mettre en cache pour moi, j'essaie juste de voir les limites que le SDK iOS impose.
- Je sais que c'est une vieille question, mais le montage a été de nouveau...le seul moyen que je connaisse pour effacer le cache manuellement grâce à un sans-papiers, méthode privée, donc je suppose que ce n'est pas vraiment possible.
- vraiment? quelle méthode est-ce? Je pourrais être sympa de jouer avec ça! privée de l'API règles ne s'appliquent pas pour les ad hoc uniquement les apps 😉
- Haha, c'est une méthode de classe sur UIImage.
[UIImage _flushSharedImageCache];
Il y a aussi[image removeFromCache];
ainsi que[UIImage removeImageNameFromCache:@"imageName"];
- stackoverflow.com/questions/14908131/...
- bonne réponse, mais il semble que le cache qui
UIImage
utilise lorsque laimageNamed:
méthode est appelée mémoire cache, et non pas un fichier de disque (comme il n'aurait aucun sens, car les images deimageNamed:
sont déjà un fichier dans l'application bundle, différemment à partir d'images chargées avecimageWithData:
et d'autres méthodes similaires). Ainsi, le_flushSharedImageCache
efface la mémoire allouée utilisé par les images dans le cache, la réduction du nombre d'avertissements de mémoire dans une utilisation massive de la mémoire application (qui était au départ, mon intention par le temps, j'ai demandé). Mais tks de toute façon 😉
Vous devez vous connecter pour publier un commentaire.
Il n'y a aucun moyen que je connaisse pour effacer manuellement cet iOS géré cache. En général, c'est un leurre. Lorsque le système d'exploitation gère quelque chose pour vous, vous n'avez pas besoin de s'inquiéter à ce sujet. Tant que vous êtes correctement libérant de tout ce que vous alloc/conserver et de manipulation de la mémoire des avertissements de façon appropriée, vous avez fait votre part.
initWithData
pour créer des images, j'essaie juste de voir les limites que le kit de développement impose.imageNamed:
.Répondre à des prises de Kevin Faible commentaire
Si vous pouvez utiliser Api privées (comme dans un AdHoc seule application, par exemple) utilisez cette
UIImage
méthode pour supprimer toutes les images stockées dans la mémoire cacheLe cache sera vidé quand elle doit l'être, c'est à dire lorsque l'application reçoit un Avertissement de Mémoire Faible. Il n'y a aucune raison pour vous de faire vous-même, et il n'y a pas d'API publique disponible.
Nous avons peut-être plus ensuite l'une des méthodes pour supprimer des images mises en cache, mais je pense que vous pouvez utilisé l'auto.le cache.removeAllObjects() qui est l'un des plus le nombre de méthodes si vous utilisez le Cache() de l'objet.Si je me trompe tout le monde peut me corrigé