1

以下の機能を使用しています。その時に呼び出すと、メモリ使用量が増えます。すべてのリークをチェックしました。それでも、機能が終了したらすぐにオブジェクトを解放します。ここでは、参照用のコードを提供しています。ガイドラインを提供してください。

//関数の開始時のメモリ使用中のメモリ(バイト単位):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の割り当てツールを使用してヒープショット分析を実行してみてください。詳細については、このブログ投稿を確認してください。

ちなみに、__ block変数の注釈を解放する方法は危険であり、ある時点でクラッシュにつながる可能性があります。その理由は、__ block変数がdispatch_asyncによって自動的に保持されないため、[self showpolyline:nannotation]の呼び出しが行われるまでに、nannotationオブジェクトの割り当てがすでに解除されている可能性があるためです。

于 2012-04-08T23:58:08.400 に答える