2009-03-17 14 views
0

グリーティング、UIImage/Memoryでの描画問題 - objective-c

私はマップ上に円を描こうとしています。このプロジェクトのすべての独立した作品は、独立して動作しますが、私は一緒にそれらを置くとき、それは壊れます。

ほとんどのものを保持して、私のviewDidLoadで私のUIをセットアップしました。このような

-(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];} 

セットアップが一度円でマップをロードしますが、マップが再び更新された場合、それがクラッシュ:

私はその後、私のリフレッシュマップメソッドを呼び出すためにタッチイベントを使用します。

mapImageのリリースをコメントアウトすると、繰り返し動作しますがメモリリークが発生します。

私が使用しているaddCircle方法:

-(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];} 

を任意の洞察力/アドバイスは大歓迎です!

答えて

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

これは良くありません。 2行目に再割り当てすると、mapImageの内容への参照が失われています。これを修正する最も簡単な方法は、おそらく追加の変数を追加するだけなので、両方の画像を追跡することができます。

+0

ありがとうございました! 私はこの提案を試してみましたが、私は新しいUIImageを作成し、その代わりにフォーマットされたイメージを割り当てましたが、残念ながら私は新しいイメージを割り当て解除しないと同じ結果を得ます。スルー。 – Puppet

+0

Mark Besseyが正しい軌道に乗っていました。私はaddcircleメソッドでtemp UIImageを作成しました。これにより、cgimageを解放し、フォーマットされたUImageを返すことができます。私はまた、これを私のrefreshMapメソッドに返すための新しいUIImageを作成しました。助けてくれてありがとう! – Puppet

関連する問題