我们开发了地图基础应用程序。我们已经在地图视图上实现了多线程显示数据。应用程序运行时间更长(大约20分钟),应用程序将显示内存警告级别-1。几分钟之后,它将给出内存警告级别-2,并且在level2应用程序将崩溃或进入睡眠状态。
我们检查了内存泄漏,僵尸很多时间。但是我们的应用程序中没有内存泄漏和僵尸。
请告知如何处理内存警告级别。请绘制一些线来克服记忆级警告。
////更新... 我发现内存使用量因
而增加 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();
}
提前致谢。
答案 0 :(得分:1)
您需要做的第一件事是衡量您的应用程序,以确定内存增长的来源。虽然您可能没有泄漏,但显然存在内存增长问题。一种可以帮助您确定内存增长来源的工具是Instruments中的Allocations工具。具体来说,您可以使用称为快照分析的技术来帮助缩小导致应用程序增长的原因。有关详情,请查看heapshot analysis上的这篇文章。