iPhone: управление памятью - PullRequest
       15

iPhone: управление памятью

1 голос
/ 21 марта 2012

Может кто-нибудь сказать мне, что я здесь делаю не так? Я использую этот метод для рисования изображения. Но что-то в коде, кажется, не высвобождается должным образом, потому что каждый раз, когда я вызываю этот метод, и объем памяти моего приложения увеличивается.

Здесь я предоставляю метод, который увеличивает мою память.

-(void)imagemaking
{
UIGraphicsEndImageContext();
NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];

SBJSON *parser = [[SBJSON alloc] init];

statuses = [parser objectWithString:responseString
                              error:nil];
[parser release];


networkConnection.image = [UIImage imageNamed:@"NetworkTrans1.png"];


[updateTimeClock setImage:[UIImage imageNamed:@"GreenClock.png"] forState:UIControlStateNormal];

NSArray *segment = [[NSArray alloc]init];
segment = [statuses valueForKey:@"Segments"];

int linewidth = 3;

CGSize polyimagesize = CGSizeMake(self.mapView.frame.size.width , self.mapView.frame.size.height);

UIGraphicsBeginImageContextWithOptions(polyimagesize, NO, 0);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, linewidth);

CGContextSetAlpha(context, 0.6);    

for(NSDictionary *route in segment) {

    NSString *locations = [route valueForKey:@"Locations"];

    if (locations && ([locations length]/16 > 1)) {       

        UIColor *color = [UIColor blueColor];
        CGContextSetStrokeColorWithColor(context, color.CGColor);

        for (int i = 0; i <= locations.length - 32; i += 32) {

            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);
        }

        CGContextStrokePath(context);

    }        
}       

madeimage =  UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();
[responseString release];   
[segment release];

}

Согласно моему исследованию, след памяти увеличивается из-за CoreGraphics. Но я не знаю, как уменьшить использование памяти или какой объект увеличивает использование памяти. Пожалуйста, предоставьте руководство.

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 21 марта 2012

Вы присваиваете [статусы valueForKey: @ "Сегменты"];сегментировать и потерять адрес, ранее выделенный [[NSArray alloc] init];

NSArray *segment = [[NSArray alloc]init]; //Array #1
segment = [statuses valueForKey:@"Segments"]; //Array #2 (replaces #1)

Финальная версия не знает о ранее выделенном адресе памяти;он может освободить только массив № 2.

[segment release];

Таким образом, оператор, который вызывает утечку первого массива, имеет вид:

segment = [statuses valueForKey:@"Segments"];
0 голосов
/ 22 марта 2012

взять временный массив и присвоить его массиву сегментов

NSArray * tempArray = [[NSArray alloc] init];

NSArray * сегмент = tempArray;

сегмент = [статусы valueForKey: @ "Сегменты"];

[выпуск tempArray];

Это позволит устранить утечку памяти, вызванную сегментарным массивом.

...