2014-02-11 3 views
0

Хорошо, я действительно отчаянно хочу найти это. Я новичок в Objective-C и не имею достаточного опыта в управлении указателями. Я знаю, что важная утечка памяти здесь, потому что выполнение этого кода несколько раз приводит к появлению множества предупреждений о памяти, но не может найти, где это или как его решить.Пожалуйста, помогите мне найти утечку памяти в этом объекте-C-методе (iOS)

Приведенный ниже метод получает данные из фиксированных массивов и создает из него группу изображений. Он обновляет фиксированное количество изображений, но только первые «n» подсчитывают, поэтому остальные заполняются прозрачными маленькими изображениями (чтобы очистить предыдущие).

(подозреваю из UIImages созданных каждое исполнение, потому что память расходуется слишком быстро во время выполнения.)

Я уже пытался добавить к линии

UIImage* img = [UIImage imageWithCGImage:image]; 

autorelease, потому что я подозреваемых в изображениях, создаваемых каждый раз при вызове этого кода, и я утверждал, что авторекламу следует вызывать, когда routeView [indexAux] .image указывает на новые созданные изображения. Я думаю, что это может сработать, но в конце концов оно закончилось ошибкой «сообщение отправлено на освобожденный экземпляр».

Также пытался заменить эту часть с помощью:

UIImage* img = [UIImage imageWithCGImage:image]; 
routeView[indexAux].image = [img copy]; 
[img release]; 

... поэтому единственная существующая копия умершего переменной IMG существуют в routeView [я] .image, и в конечном итоге были перезаписан при следующем исполнении. Но закончилась такая же утечка памяти. Любая помощь или подсказка приветствуются. Заранее спасибо!

-(void) update:(NSArray*) arr{ 
    int indexAux = 0; 
    for(NSNumber* i in arr){ 
     int index = [i integerValue]; 
     CGContextRef context = CGBitmapContextCreate(nil, 
                routeView[indexAux].frame.size.width, 
                routeView[indexAux].frame.size.height, 
                8, 
                4 * routeView[indexAux].frame.size.width, 
                CGColorSpaceCreateDeviceRGB(), 
                kCGImageAlphaPremultipliedLast); 

     self.lineColor = [coloresDeSeccion[index] copy]; 

     CGContextSetStrokeColorWithColor(context, self.lineColor.CGColor); 
     CGContextSetRGBFillColor(context, 0.0, 0.0, 1.0, 1.0); 
     CGContextSetLineWidth(context, 5.0); 

     for(int i = sections[index]; i <= sections[index + 1]; i++) { 
      CLLocation* location = [routes objectAtIndex:i]; 
      CGPoint point = [mapView convertCoordinate:location.coordinate toPointToView:routeView[indexAux]]; 
      if(i == sections[index]) { //¿Que hacías aquí? 
       CGContextMoveToPoint(context, point.x, routeView[indexAux].frame.size.height - point.y); 
      } else { 
       CGContextAddLineToPoint(context, point.x, routeView[indexAux].frame.size.height - point.y); 
      } 
     } 

     CGContextStrokePath(context); 

     CGImageRef image = CGBitmapContextCreateImage(context); 
     UIImage* img = [UIImage imageWithCGImage:image]; 

     routeView[indexAux].image = img; 

     CGContextRelease(context); 
     indexAux++; 
    } 

    for(int i = indexAux; i < 15; i++){ 
     UIGraphicsBeginImageContextWithOptions(CGSizeMake(36, 36), NO, 0.0); 
     UIImage *blank = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 
     routeView[indexAux].image = blank; 
    } 
} 

ответ

5

Вы создаете изображение здесь:

CGImageRef image = CGBitmapContextCreateImage(context); 

Эта функция включает в себя слово Create в нем. Согласно Create Rule, вы должны отпустить его:

CFRelease(image); 
+0

Хорошо, я попробую, спасибо! – Pepper

+0

ЭТО РАБОТАЕТ !!!! Спасибо, мужик, ты спас мне жизнь! Я был немного смущен тем, что являюсь структурой, потому что он не поддерживает метод «release», но по какой-то причине я не думал, что у него есть собственный метод выпуска. Еще раз спасибо. – Pepper

Смежные вопросы