Как мы можем обработать предупреждение об уровне памяти в iPhone? - PullRequest
1 голос
/ 14 марта 2012

Мы разработали приложение карты базы.Мы реализовали многопоточность для отображения данных на виде карты.Пока приложение работает дольше (около 20 минут), приложение будет отображать предупреждение о уровне памяти уровня 1.И через пару минут он выдаст предупреждение памяти уровня 2, а после того, как приложение уровня 2 выйдет из строя или перейдет в спящий режим.

Мы проверили утечки памяти, много времени у зомби.Но в нашем приложении нет утечки памяти и зомби.

Пожалуйста, посоветуйте, как справиться с уровнем предупреждения о памяти.Пожалуйста, нарисуйте некоторую линию, чтобы преодолеть предупреждение об уровне памяти.

//// Обновление ... Я обнаружил, что использование памяти увеличивается из-за

CGContextRef context = UIGraphicsGetCurrentContext();

, который я использовалмногопоточность для рисования поли-аннотации и для этого я использовал CGContextRef, который увеличивает мое использование памяти всякий раз, когда я вызываю его.

я не знаю, как освободить контекст, потому что, если я освобождаю его, чем в следующий раз, он показывает мне

Недопустимая ошибка контекста Я размещаю свой код для рисования здесь. Пожалуйста, помогите мне, если у кого-то есть идеи.

-(void) drawRect:(CGRect)rect {
NVPolylineAnnotation* annotation = self.annotation;

CGFloat POLYLINE_WIDTH = 9;

if(annotation.getZoomLevel == 7) {
    POLYLINE_WIDTH = 1.5;
}
else if(annotation.getZoomLevel == 8) {
    POLYLINE_WIDTH = 2.5;
}
else if(annotation.getZoomLevel ==9) {
    POLYLINE_WIDTH = 3;   
}    
else if(annotation.getZoomLevel ==10) {
    POLYLINE_WIDTH = 3.4;   
}    
else if(annotation.getZoomLevel == 11) {
    POLYLINE_WIDTH = 4;
}    
else if(annotation.getZoomLevel <= 13) {
    POLYLINE_WIDTH = 4.3;
}
else if (annotation.getZoomLevel == 14) {
    POLYLINE_WIDTH = 5.4;
}
else if(annotation.getZoomLevel == 15) {
    POLYLINE_WIDTH = 8;
}


CGContextRef context = UIGraphicsGetCurrentContext();
CGContextClearRect(context, rect);
CGContextSetLineWidth(context, POLYLINE_WIDTH);
CGContextSetAlpha(context, 0.6);    

for(NSDictionary *route in annotation.routes) {

    NSString *locations = [route valueForKey:@"Locations"];
    double speed = [[route valueForKey:@"Speed"] doubleValue];


    if (locations && ([locations length]/16 > 1)) {       

        UIColor *color;
        if (speed <= 20) {
            color = [UIColor colorWithRed:222/255.0 green:0/255.0 blue:0/255.0 alpha:1.0];
        }
        else if (speed <= 40) {
            color = [UIColor colorWithRed:253/255.0 green:91/255.0 blue:2/255.0 alpha:1.0];
        }
        else if (speed <= 60) {
            color = [UIColor colorWithRed:253/255.0 green:145/255.0 blue:4/255.0 alpha:1.0];
        }
        else if (speed <=80) {
            color = [UIColor colorWithRed:255/255.0 green:212/255.0 blue:4/255.0 alpha:1.0];
        }
        else if (speed >80) {
            color = [UIColor colorWithRed:42/255.0 green:176/255.0 blue:39/255.0 alpha:1.0];
        }

        CGContextSetStrokeColorWithColor(context, color.CGColor);

        for (int i = 0; i <= locations.length - 32; i += 32) {

            CLLocationCoordinate2D coordinates;
            coordinates.latitude = hexDecode([locations substringWithRange:NSMakeRange(i, 16)]);
            coordinates.longitude = hexDecode([locations substringWithRange:NSMakeRange(i+16, 16)]);

            CGPoint point = [_mapView convertCoordinate:coordinates toPointToView:self];

            if (i == 0)
                CGContextMoveToPoint(context, point.x, point.y);
            else
                CGContextAddLineToPoint(context, point.x, point.y);
        }
        [self setNeedsDisplay];
        CGContextStrokePath(context);

    }   
}   
context = NULL;
UIGraphicsEndImageContext();    

}

Заранее спасибо.

1 Ответ

1 голос
/ 09 апреля 2012

Первое, что вам нужно сделать, это измерить ваше приложение, чтобы выяснить, откуда идет рост памяти.Хотя у вас нет утечек, у вас, очевидно, есть проблема с ростом памяти.Одним из инструментов, который поможет вам определить источник роста памяти, являются инструменты Allocations в инструментах.В частности, вы можете использовать технику, называемую анализом кучи, чтобы сузить причины роста вашего приложения.Для получения дополнительной информации, проверьте этот пост на анализ кучи .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...