1

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

//函数开始时的内存 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];
} 

谢谢。

4

1 回答 1

1

要确定哪些对象导致您的内存增长,请尝试使用 Instruments 中的 Allocations 工具执行 heapshot 分析。查看此博客文章了解更多详细信息。

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

于 2012-04-08T23:58:08.400 回答