以下功能的内存占用增加在哪里?

时间:2012-04-05 10:47:41

标签: iphone ios multithreading memory cgbitmapcontextcreate

我正在使用以下功能。每当我打电话给它时,它会增加我的内存使用量。我检查了所有泄漏。甚至,我在功能结束时立即释放对象。在这里,我提供我的代码供参考。请提供指南。

//功能开始时的内存 正在使用的内存(以字节为单位):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];
} 

感谢。

1 个答案:

答案 0 :(得分:1)

要确定哪些对象导致内存增长,请尝试使用“仪器”中的“分配”工具执行快照分析。查看this blog post了解详情。

作为旁注,释放__block变量注释的方式很危险,可能会在某些时候导致崩溃。原因是__block变量不会被dispatch_async自动保留,因此在调用[self showpolyline:nannotation]时,注释对象可能已经被释放。