我正在使用以下功能。每当我调用它时,它都会增加我的内存使用量。我检查了所有泄漏。甚至,我在功能结束时立即释放对象。在这里,我提供我的代码供参考。请提供指导。
//函数开始时的内存 Memory in use (in bytes): 38936576
//函数结束时的内存(池耗尽后)正在使用的内存(以字节为单位):39272448
//功能
-(void)parsing:(NSMutableData *)respose
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
report_memory();
NSString *responseString = [[NSString alloc] initWithData:respose encoding:NSUTF8StringEncoding];
SBJSON *parser = [[SBJSON alloc] init];
//NSLog(@"statuses>>>>>");
statuses = [parser objectWithString:responseString
error:nil];
[parser release];
//report_memory();
refreshCounter = YES;
__block NSArray *segment =[[NSArray alloc]initWithArray:[statuses valueForKey:@"Segments"]];
int mapzoomlevel = [self getZoomLevel];
int polylinewidth = 9;
if(mapzoomlevel == 7) {
polylinewidth = 1.5;
}
else if(mapzoomlevel == 8) {
polylinewidth = 2.5;
}
else if(mapzoomlevel ==9) {
polylinewidth = 3;
}
else if(mapzoomlevel ==10) {
polylinewidth = 3.4;
}
else if(mapzoomlevel == 11) {
polylinewidth = 4;
}
else if(mapzoomlevel <= 13) {
polylinewidth = 4.3;
}
else if (mapzoomlevel == 14) {
polylinewidth = 5.4;
}
else if(mapzoomlevel== 15) {
polylinewidth = 8;
}
__block CGContextRef context = NULL;
CGColorSpaceRef colorSpace;
//void * bitmapData;
int bitmapByteCount;
int bitmapBytesPerRow;
bitmapBytesPerRow = (self.mapView.frame.size.width * 4);
bitmapByteCount = (bitmapBytesPerRow * self.mapView.frame.size.height);
colorSpace = CGColorSpaceCreateDeviceRGB();
// bitmapData = malloc( bitmapByteCount );
context = CGBitmapContextCreate (NULL,
self.mapView.frame.size.width,
self.mapView.frame.size.height,
8, // bits per component
bitmapBytesPerRow,
colorSpace,
kCGImageAlphaPremultipliedLast);
CGContextSetAllowsAntialiasing (context,YES);
CGColorSpaceRelease( colorSpace );
CGContextTranslateCTM(context, 0, self.mapView.frame.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextSetLineWidth(context, polylinewidth);
CGContextSetAlpha(context, 0.6);
UIColor *color;
for(NSDictionary *route in segment) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
NSString *locations = [route valueForKey:@"Locations"];
double speed = [[route valueForKey:@"Speed"] doubleValue];
if (locations && ([locations length]/16 > 1)) {
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) {
NSAutoreleasePool *loc = [[NSAutoreleasePool alloc]init];
CLLocationCoordinate2D coordinates;
coordinates.latitude = hexDecode_iPhone([locations substringWithRange:NSMakeRange(i, 16)]);
coordinates.longitude = hexDecode_iPhone([locations substringWithRange:NSMakeRange(i+16, 16)]);
CGPoint point = [mapView convertCoordinate:coordinates toPointToView:self.mapView];
if (i == 0)
CGContextMoveToPoint(context, point.x, point.y);
else
CGContextAddLineToPoint(context, point.x, point.y);
[loc drain];
}
CGContextStrokePath(context);
}
[pool drain];
}
[segment release];
[polyImage release];
CGImageRef ref = CGBitmapContextCreateImage(context);
polyImage = [UIImage imageWithCGImage:ref];
CGImageRelease(ref);
CGContextRelease(context);
[responseString release];
__block NWAnotation *nannotation = [[NWAnotation alloc]initWithImage:polyImage
mapView:mapView
zoomLevel:ZOOM_LEVEL
aRoadFlag:aRoadFlag
nRoadFlag:nRoadFlag
othersRoadFlag:othersRoadFlag];
dispatch_queue_t queue1 = dispatch_queue_create("com.MyApp.AppTask",NULL);
dispatch_queue_t main = dispatch_get_main_queue();
dispatch_async(queue1,
^{
dispatch_async(main,
^{
@try {
//NSLog(@"%d",[queue operationCount]);
[self showpolyline:nannotation];
}
@catch (NSException *exception) {
NSLog(@"exception");
}
});
});
dispatch_release(queue1);
dispatch_release(main);
[nwAnotation release];
[nannotation release];
report_memory();
[pool drain];
}
谢谢。