как освободить память из анимации UIImage Array - PullRequest
0 голосов
/ 03 декабря 2011

Я хотел бы знать, как освободить память из массива анимации, так или иначе, в инструментах анимационная картинка пожирает 24 МБ реальной памяти. что я должен сделать, чтобы освободить память? общий размер файла изображения составляет около 3 МБ в Mac OS.

* РЕДАКТИРОВАТЬ: * Круто, я включил настройку ARC в настройке сборки, больше не сбой ... но использование памяти по-прежнему колеблется около 80 - 120 МБ физической памяти .....

это строка для образа.

    -(void)defaultSetup
{

    self.imageArray = [[NSMutableArray alloc] initWithObjects:
                       [UIImage imageWithContentsOfFile:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"default/d7.jpg"]],
                        [UIImage imageWithContentsOfFile:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"default/d9.jpg"]],
                        [UIImage imageWithContentsOfFile:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"default/d11.jpg"]],
                        [UIImage imageWithContentsOfFile:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"default/d27.jpg"]],
                        [UIImage imageWithContentsOfFile:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"default/d6.jpg"]],                        
                        nil];
    self.defaultID = [[NSMutableArray alloc] initWithObjects:@"0",@"1",@"2",@"3",@"0",nil];
    self.defaultImageCaption = [[NSMutableArray alloc] initWithObjects:@"Ver",@"Green",@"Red",@"Cru",@"East",nil];      


    NSUInteger count = [self.defaultID count];
    NSLog(@"Count %i",[self.defaultID count]);
    NSMutableArray *randomImgName = self.imageArray;
    NSMutableArray *randomID = self.defaultID;
    NSMutableArray *randomName = self.defaultImageCaption;

    for (NSUInteger i = 0; i < count; ++i) {
        // Select a random element between i and end of array to swap with.
        int nElements = count - i;
        int n = (arc4random() % nElements) + i;
        [randomName exchangeObjectAtIndex:i withObjectAtIndex:n];
        [randomImgName exchangeObjectAtIndex:i withObjectAtIndex:n];
        [randomID exchangeObjectAtIndex:i withObjectAtIndex:n];
    }
    self.imageArray = randomImgName;
    self.defaultID=randomID;
    self.defaultImageCaption=randomName;

    NSLog(@"default filename %@",self.defaultImageCaption);
    NSLog(@"default ID %@",self.defaultID);
    self.imageViewTop.alpha = 1.0;
    self.imageViewBottom.alpha = 0.0;
    self.imageViewBottom = [[[UIImageView alloc] initWithFrame:CGRectMake(0,44,320,367)] autorelease];
    self.imageViewTop = [[[UIImageView alloc] initWithFrame:CGRectMake(0,44,320,367)] autorelease];
    [self.view addSubview:imageViewTop];
    [self.view addSubview:imageViewBottom];

    self.buttonCaption = [UIButton buttonWithType:UIButtonTypeCustom];
    //default placement
    self.buttonCaption.frame = CGRectMake(245, 365, 70, 30);
    //[buttonCaption setTitle:@"\u00A9"  forState:UIControlStateNormal];
    [self.buttonCaption addTarget:self action:@selector(buttonCheck) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:self.buttonCaption];

    [self nextAnimation:buttonCaption.frame.size.width]; 

}

-(void)nextAnimation:(float)previousWidth {

    //picture loop
    imageViewTop.image = imageViewBottom.image;
    imageViewBottom.image = [imageArray objectAtIndex:[imageArray count] - 1];

    [imageArray insertObject:imageViewBottom.image atIndex:0];
    [imageArray removeLastObject];
    imageViewTop.alpha = 1.0;
    imageViewBottom.alpha = 0.0;

    //Name Caption
    NSString * tempCaption = [defaultImageCaption objectAtIndex:[defaultImageCaption count]-1];
    self.dID = [defaultID objectAtIndex:[defaultID count]-1];

    // make the buttons content appear in the top-left
    [buttonCaption setContentHorizontalAlignment:UIControlContentHorizontalAlignmentCenter];
    [buttonCaption setContentVerticalAlignment: UIControlContentVerticalAlignmentCenter ];



    [defaultImageCaption insertObject:tempCaption atIndex:0];
    [defaultImageCaption removeLastObject];
    [defaultID insertObject:dID atIndex:0];
    [defaultID removeLastObject];

    [UIView animateWithDuration:1 delay:2 options:0       
                     animations:^{                          
                         [buttonCaption setTitle:tempCaption  forState:UIControlStateNormal];
                         //NSLog(@"Name %@",tempCaption );
                         //NSLog(@"ID %@",dID);
                     } 
                     completion:^(BOOL  completed)
     {
     }];  

Ответы [ 3 ]

1 голос
/ 03 декабря 2011

Читайте об управлении памятью Какао. (Я предполагаю, что вы не используете ARC (автоматический подсчет ссылок).) Кстати, я бы подумал об использовании ARC, это облегчит вашу жизнь. (Это технология времени компиляции, поэтому она обратно совместима с более ранними версиями iOS, но вы не получите слабую справочную поддержку на старых версиях iOS.)

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

Вещи, которые увеличивают счет удержания:

self.propertyName = anInstance, когда это свойство объявлено со свойством retain.

[objectInstance retain].

[Class alloc], [Class new], [objectInstance copy] или варианты, начинающиеся с copy.

Добавление объекта в стандартный класс коллекции (например, NSArray).

Вещи, которые уменьшают счет удержания:

self.propertyName = <some other object instance or nil>, когда это свойство объявлено со свойством retain.

[objectInstance release]

[objectInstance autorelease] (вызывает освобождение через некоторое время).

Удаление объекта из стандартного класса коллекции (например, NSArray).

1 голос
/ 03 декабря 2011

Когда что-то создается с помощью alloc и init или initWith* (как здесь делается с imageArray), вы можете разблокировать это с помощью release:

[self.imageArray release];

Если естьЕсли задействованы autorelease или retain звонки, все может стать немного сложнее.Но они, кажется, не вступают в игру здесь.

0 голосов
/ 16 января 2012

Если вы загружаете изображения лениво (вместо получения массива UIImages imageArray, создающего массив их местоположений), вы можете сэкономить много памяти и легко очистить экземпляры UIImage. При этом максимальное количество загружаемых в память изображений будет не более 3; это может сэкономить оперативную память.

пример по запросу:

при инициализации массива,

self.imageArray = [[NSMutableArray alloc] initWithObjects:
               @"default/d7.jpg",
               @"default/d9.jpg",
               @"default/d11.jpg",
               @"default/d27.jpg",
               @"default/d6.jpg",                        
               nil];

при загрузке фактического изображения

NSString* imgPath = [imageArray objectAtIndex:[imageArray count] - 1];
imgPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:imgPath];
imageViewBottom.image = [UIImage imageWithContentsOfFile:imgPath];

Дайте мне знать, если это поможет!

...