2009-03-17 3 views
0

인사말,UIImage/메모리 문제에 드로잉 - 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)]; 

좋지 않습니다. 두 번째 줄에 mapImage를 재 할당 할 때 mapImage의 내용에 대한 참조가 손실됩니다. 아마 추가 변수를 추가하는 경우이 문제를 해결하는 가장 쉬운 방법이므로 두 이미지를 모두 추적 할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 나는이 제안을 시도했지만 새로운 UIImage를 만들고 대신 형식이 지정된 이미지를 할당했지만 유감스럽게도 새 이미지의 할당을 해제하지 않으면 동일한 결과를 얻습니다. 또한 앱 누수가 발생합니다. 그렇지 않으면 두 번째로 충돌합니다. 을 통하여. – Puppet

+0

Mark Bessey는 올바른 길을 걷고있었습니다. addcircle 메서드에서 임시 UIImage를 만들었습니다. 그러면 cgimage를 릴리스하고 형식이 지정된 UImage를 반환 할 수 있습니다. 나는 또한이 새로운 refreshMap 메서드에서 반환 될 수있는 새 UIImage를 만들었습니다. 도와 주셔서 감사합니다! – Puppet