2009-09-29 10 views
1

Je suis à la recherche d'un bug étrange. Le bug se manifeste avec l'affichage de ce message dans le journal de la console:Erreur malloc étrange avec UIImages auto-libérés de la taille spécifiée

BlurApp(5018,0xa00d6500) malloc: *** error for object 0x103b000: pointer being freed was not allocated 

Ce message apparaît après l'exécution a quitté ma boucle d'événements. Cela semble se produire lorsque le pool d'autorelease est drainé. Voici le code qui semble déclencher l'erreur:

- (UIImage*)imageWithImage:(UIImage*)image 
    scaledToSize:(CGSize)newSize; 
{ 
UIGraphicsBeginImageContext(newSize); 
[image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)]; 
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

return newImage; 
} 

J'appelle imageWithImage ainsi:

UIImage* theImage = [self imageWithImage:origImage scaledToSize:rect.size]; 

theImage est utilisé dans la routine et je suppose que l'appel autorelease prendra soin.

Si je modifie le return newImage; pour renvoyer [newImage retain]; le message d'erreur ne s'affiche pas.

Maintenant, voici ce qui est très étrange. Cette erreur se produit uniquement avec certaines tailles de newSize. en particulier, il arrive toujours que la taille et la largeur de newSize soient égales à un nombre compris entre 55 et 176, sauf 56, 110, 112, 114 et pas pour les autres valeurs de hauteur et de largeur comprises entre 5 et 300. (hauteur et largeur toujours égal pour tous les tests)

Je pourrais utiliser quelques yeux frais sur ce ... merci!

+0

Cela semble être un bug dans le simulateur 3.0 SDK. Je ne vois pas ces messages d'erreur avec SDK 3.1 du simulateur, et je ne vois pas l'erreur sur l'iPhone. – mahboudz

Répondre

0

Essayez d'imprimer le retainCount de l'image renvoyée par UIGraphicsGetImageFromCurrentImageContext.

Quelque chose comme: NSLog (@ "Nombre d'images retenues:% u", [newImage retainCount]);

ou mettre un point d'arrêt sur le code et tapez la commande suivante à la console gdb:

print (int) [newImage retainCount]

Le retainCount doit être supérieur à zéro, probablement l'un. Parcourez le code et continuez à vérifier le retainCount pour voir quand il atteint zéro.

Il y a un fil similaire à: iPhone development: pointer being freed was not allocated

+0

Le lien en bas pointe vers un problème similaire qui me fait penser que c'est un bug dans le simulateur. J'aurais dû mentionner que je courais sur le simulateur. J'ai essayé l'application sur l'iPhone. Pas d'erreurs là-bas. J'ai également essayé avec Simulator 3.1 SDK au lieu de 3.0. Pas d'erreurs sous Simulator 3.1. – mahboudz

0

theImage is used in the calling routine and then I assume autorelease will take care of it.

If I change the return newImage; to return [newImage retain]; the error message is not seen.

Now, here is what is very strange. This error only occurs with certain sizes of newSize.

Dans une langue recueilli des ordures, les objets peuvent être nettoyés (Freed) par le collecteur d'ordures quand il n'y a pas de références plus à l'objet. Pour améliorer les performances, la récupération de place peut être retardée, c'est-à-dire jusqu'à ce qu'il y ait un temps d'inactivité, un certain délai ou que les conditions de mémoire atteignent un certain seuil. Par conséquent, certains objets peuvent être libérés immédiatement, d'autres peuvent être libérés beaucoup plus tard ou ne jamais être libérés (jusqu'à ce que l'environnement s'arrête).

+0

Ceci est pour l'iPhone, qui ne dispose pas de garbage collection. –