Утечка памяти при использовании NSString внутри для цикла - PullRequest
3 голосов
/ 27 января 2012

У меня в наборе ресурсов 100 изображений с именем image1.jpg, image2.jpg. По сути, я пытаюсь динамически создавать пути к этим изображениям внутри цикла for.
Во время тестирования в симуляторе изображения загружались нормально, и приложение не зависало. Но во время тестирования приложения с инструментами я был шокирован, увидев сильную утечку памяти, которая происходила во время создания объекта path1.

     I am pasting  the entire method here for reference

- (id)init {
self = [super init];
if (self) {             

    self.arrayImages = [[[NSMutableArray alloc] init] autorelease];      

    for(int i=1 ; i<100 ; i++){            

        NSString *str = [NSString stringWithFormat:@"Century%d",i];
        NSString *path1 = [[NSBundle mainBundle] pathForResource:str ofType:@"jpg"];            
        [self.arrayImages addObject:path1];        
    }                        
}
return self;

}

Поскольку я не использовал какие-либо ресурсы alloc внутри цикла, я не имею права собственности и, следовательно, не имею права освобождать объект. В чем причина этой утечки памяти ??

Пожалуйста, объясните проблему и предоставьте необходимое решение для ее устранения.

Как всегда, любая помощь высоко ценится.

Ответы [ 3 ]

3 голосов
/ 27 января 2012

arrayImages сохраняет path1, поэтому, если вы не отпустите arrayImages, произойдет утечка. Как вы создаете arrayImages и выпускаете ли вы его где-нибудь?

Отредактировано на основе комментариев:

Убедитесь, что вы выпустили arrayImages в вашем методе -dealloc следующим образом: [arrayImages release]; (обратите внимание на отсутствие self).

2 голосов
/ 27 января 2012

В показанном вами коде нет утечки.

Есть (как минимум) две возможности:

  1. У вас есть утечка в коде, который вы не вставилина ваш вопрос
  2. Все хорошо, и инструменты дали вам ложноположительный результат

Ваш цикл создаст много автоматически выпущенных переменных.Они не будут освобождены до тех пор, пока цикл не закончится, но именно так он и должен работать.

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

Причиной утечки будет следующая строка:

NSString *str = [NSString stringWithFormat:@"Century%d",i];

При использовании вспомогательных методов в Objective-C в фоновом режиме происходит следующее:

NSString *str = [[[NSString alloc] initWithFormat:@"Century%d", i] autorelease];

Не использовать alloc / init для создания слабой ссылки - заблуждение.Вы всегда являетесь владельцем созданного объекта, независимо от того, как вы его создаете.Удобный метод просто делает alloc / init и автоматически выпускает его для вас.

Вот что я бы посоветовал вам сделать, чтобы избежать утечки памяти:

- (id)init {
    self = [super init];
    if (self) {             

        self.arrayImages = [[[NSMutableArray alloc] init] autorelease];

        NSAutoreleasePool *tmpPool = [[NSAutoreleasePool alloc] init];

        for(int i = 1 ; i < 100 ; i++) {

            NSString *str = [NSString stringWithFormat:@"Century%d",i];
            NSString *path1 = [[NSString alloc] initWithString:[[NSBundle mainBundle] pathForResource:str ofType:@"jpg"]];
            [self.arrayImages addObject:path1];
            [path1 release];
        }

        [tmpPool drain];
    }
    return self;
}

Дайте мне знать, если это работает лучше дляyou.

-EDIT- Выделение объекта path1 и освобождение его после добавления в arrayImages.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...