绘制 UIImage / 内存问题-objective-c

Posted

技术标签:

【中文标题】绘制 UIImage / 内存问题-objective-c【英文标题】:Drawing on UIImage / Memory issue - objective-c 【发布时间】:2009-03-17 07:00:22 【问题描述】:

您好,

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

我在 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】:
UIImage *mapImage = [[UIImage alloc] initWithData:data];
mapImage = [self addCircle:(mapImage) influence:(70) latCon:(320) lonCon:(320)];

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

【讨论】:

感谢您的回复!我确实尝试了这个建议,我创建了一个新的 UIImage 并将格式化的图像分配给它,但不幸的是我得到了相同的结果,如果我不取消分配新图像,我的应用程序也会泄漏,否则它会第二次崩溃。 Mark Bessey 是在正确的轨道上:我在 addcircle 方法中创建了一个临时 UIImage,它允许我释放 cgimage 并返回我格式化的 UImage。我还为此创建了一个新的 UIImage,以便在我的 refreshMap 方法中返回。感谢您的帮助!

以上是关于绘制 UIImage / 内存问题-objective-c的主要内容,如果未能解决你的问题,请参考以下文章

UIImage 实现/分页?

为啥在屏幕上绘制图像之前不会出现内存不足的问题?

将 NSString 绘制到 UIImage

绘制 UIView 并转换为 UIImage

绘制文本并添加到 UIImage iOS 5/6

用比例绘制 UIImage 并平移