借鉴UIImage / Memory问题 - objective-c

时间:2009-03-17 07:00:23

标签: uiimageview release

问候,

我正试图在地图上画一个圆圈。这个项目的所有单独部分都是独立工作的,但是当我把它们放在一起时它就会中断。

我在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];}

非常感谢任何见解/建议!

1 个答案:

答案 0 :(得分:0)

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

那不好。当您在第二行重新分配时,您将失去对mapImage内容的引用。解决此问题的最简单方法,如果可能只是添加一个额外的变量,那么您可以跟踪这两个图像。