Опираясь на UIImage / Проблема памяти - target-c - PullRequest
0 голосов
/ 17 марта 2009

Привет,

Я пытаюсь нарисовать круг на карте. все отдельные части этого проекта работают независимо, но когда я соединяю их все вместе, они ломаются.

Я настроил свой интерфейс в viewDidLoad, сохранив большую его часть.

Затем я использую сенсорные события для вызова метода моей карты обновления:

-(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 голосов
/ 17 марта 2009
UIImage *mapImage = [[UIImage alloc] initWithData:data];
mapImage = [self addCircle:(mapImage) influence:(70) latCon:(320) lonCon:(320)];

Это не хорошо. Вы теряете ссылку на содержимое mapImage, когда переназначаете его во второй строке. Самый простой способ исправить это, если, вероятно, просто добавить дополнительную переменную, чтобы вы могли отслеживать оба изображения.

...