2012-04-05 6 views
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]; 
} 

感謝。

+0

プールを排水した後にメモリを報告しないのはなぜですか? – borrrden

+0

あなたはnannotationのリリースを見逃していませんか? – dariaa

+0

@dariaa:私もそれをしました...何の違いもありません...私はここに追加することを忘れました。 – Nit

答えて

1

メモリの増加を引き起こすオブジェクトを特定するには、InstrumentsのAllocationsツールを使用してヒープショット分析を実行してください。詳細はthis blog postをご覧ください。

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

+0

ありがとうございますans..iはブロック変数を説明するために5を加えます。 – Nit

関連する問題