Не протекает ли утечка даже с выпуском в нужном месте (наверное)? - PullRequest
1 голос
/ 21 сентября 2010

Когда я анализирую следующий код с помощью Instruments, он сообщает об утечке переменной imageName :

//loadImagesFromPotatoesIndexesArray
-(void) loadImagesFromPotatoesIndexesArray{

    //Load Textures from Disk
    textures = [[NSMutableArray alloc] init];
    //NSArray *masks = [[NSArray alloc] initWithArray:mainDelegate.masksArray];

    for (int i = 0;i<[potatoesIndexesArray count];i++){ 

        int imageNumber = [[potatoesIndexesArray objectAtIndex:i]intValue];

        NSString *imageName = [[NSString alloc] initWithFormat:@"texture%d",imageNumber];

        UIImage *image = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:imageName ofType:@"png"]];

        NSArray *pics = [[NSArray alloc] initWithObjects:
                         [self maskImage:image withMask:[mainDelegate.masksArray objectAtIndex:i]],
                         [self maskImage:image withMask:[mainDelegate.masksArray objectAtIndex:i]],
                         imageName, 
                         nil]; 

        [textures addObject:pics];

        [image release];
        [imageName release];
        [pics release];
    }
}

[potatoIndexesArray count] = 16, так что у меня в 16 раз больше утечки NSCFString ... Но для меня код относится к управлению памятью ... очевидно, нет !!! Что я сделал не так?

Ответы [ 4 ]

3 голосов
/ 21 сентября 2010

Вы никогда не освободите массив 'textures'. Он все еще держит все.

1 голос
/ 21 сентября 2010

Как часто в вашем коде вызывается loadImagesFromPotatoesIndexesArray? Если вызывается более одного раза, все значения в исходном массиве будут пропущены, так как вы не выпустите должным образом textures перед заменой его новым массивом.

Если является вызываемым более одного раза, это должно сработать:

// load textures from disk
[textures removeAllObjects];
//NSArray *masks = [[NSArray ...

for (int i=0; ...
0 голосов
/ 21 сентября 2010

Это сложный вопрос.Вы выделяете imageName, поэтому retainCount равен 1, затем вы добавляете его в массив, счетчик хранения равен 2, когда вы освобождаете imageName, счетчик сохранения снова равен 1.Тогда, если вы также освободите массив фото, все будет хорошо.Но ваш массив изображений добавляется в текстуры, а затем высвобождается pics, поэтому количество сохраненных изображений остается равным 1. И ваше imageName пропущено.Но если вы освободите массив textures, все будет хорошо

    NSString *imageName = [[NSString alloc] initWithFormat:@"texture%d",imageNumber];

   NSArray *pics = [[NSArray alloc] initWithObjects:
                     [self maskImage:image withMask:[mainDelegate.masksArray objectAtIndex:i]],
                     [self maskImage:image withMask:[mainDelegate.masksArray objectAtIndex:i]],
                     imageName, 
                     nil]; 

    [imageName release];
0 голосов
/ 21 сентября 2010

Если вы думаете, что когда вы добавляете imageName в свой массив изображений, он сохраняет его ;-) (я думаю, что это ответ на ваш вопрос)

Но почему вы делаете выделение здесь?почему бы не сделать что-то вроде

[ NSString stringWithFormat:@"" ]
?

Удачи!

...