2009-03-17 8 views
0

Salutations,Dessin sur UIImage/Problème de mémoire - objectif-c

J'essaie de dessiner un cercle sur une carte. toutes les pièces séparées de ce projet fonctionnent de manière indépendante mais quand je les mets tous ensemble ça casse.

Je configure mon interface utilisateur dans viewDidLoad, en conservant la plus grande partie.

je puis utiliser des événements tactiles pour appeler ma méthode carte de rafraîchissement:

-(void)refreshMap{ 

NSString *thePath = [NSString stringWithFormat:@"http://maps.google.com/staticmap?center=%f,%f&zoom=%i&size=640x640&maptype=hybrid",viewLatitude, viewLongitude, zoom]; 
NSURL *url = [NSURL URLWithString:thePath]; 
NSData *data = [NSData dataWithContentsOfURL:url]; 
UIImage *mapImage = [[UIImage alloc] initWithData:data]; 

mapImage = [self addCircle:(mapImage) influence:(70) latCon:(320) lonCon:(320)]; 
NSLog(@"-- mapimageview retaincount %i",[mapImage retainCount]);  

mapImageView.image = mapImage; 
[mapImage release];} 

installation comme cela, il va charger la carte avec un cercle une fois, mais si la carte est mise à jour à nouveau, il se bloque.

Si je commente la version de mapImage, cela fonctionne à plusieurs reprises mais provoque une fuite de mémoire.

La méthode AddCircle J'utilise:

-(UIImage *)addCircle:(UIImage *)img radius:(CGFloat)radius latCon:(CGFloat)lat lonCon:(CGFloat)lon{ 
int w = img.size.width; 
int h = img.size.height; 
lon = h - lon; 
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
CGContextRef context = CGBitmapContextCreate(NULL, w, h, 8, 4 * w, colorSpace, kCGImageAlphaPremultipliedFirst); 

//draw the circle 
CGContextDrawImage(context, CGRectMake(0, 0, w, h), img.CGImage); 
CGRect leftOval = {lat- radius/2, lon - radius/2, radius, radius}; 
CGContextSetRGBFillColor(context, 0.0, 0.0, 1.0, 0.3); 
CGContextAddEllipseInRect(context, leftOval); 
CGContextFillPath(context); 

CGImageRef imageMasked = CGBitmapContextCreateImage(context); 
CGContextRelease(context); 
CGColorSpaceRelease(colorSpace); 

return [UIImage imageWithCGImage:imageMasked];} 

Toute idée/conseil est grandement appréciée!

Répondre

0
UIImage *mapImage = [[UIImage alloc] initWithData:data]; 
mapImage = [self addCircle:(mapImage) influence:(70) latCon:(320) lonCon:(320)]; 

Ce n'est pas bon. Vous perdez la référence au contenu de mapImage lorsque vous le réattribuez sur la deuxième ligne. Le moyen le plus simple de résoudre ce problème est probablement de simplement ajouter une variable supplémentaire pour que vous puissiez suivre les deux images.

+0

Merci pour votre réponse! J'ai essayé cette suggestion, j'ai créé une nouvelle UIImage et j'y ai assigné l'image formatée, mais malheureusement je reçois le même résultat, si je ne libère pas la nouvelle image aussi mon application fuit, sinon elle se bloque la 2ème fois par. – Puppet

+0

Mark Bessey était sur la bonne voie: j'ai créé un UIImage temp dans ma méthode addcircle, ce qui me permet de libérer le cgimage et de renvoyer mon UImage formaté. J'ai également créé un nouveau UIImage pour que cela soit retourné dans ma méthode refreshMap. Merci pour l'aide! – Puppet