Утечка памяти при использовании NSArray componentsSeparatedByString - PullRequest
1 голос
/ 23 августа 2011

Я запускаю приложение Instruments с шаблоном Leaks, и оно говорит мне, что у меня есть утечка на линии:

NSArray *tempFavs = [tempFavString componentsSeparatedByString:@"|"];

Я видел, что у некоторых других людей были подобные проблемы, но у меня нетне видел каких-либо решений.Кажется, этот массив должен быть автоматически выпущен, и мне не нужно беспокоиться об этом.Все массивы, которые я выделил, высвобождаются в методе dealloc.Вот весь соответствующий код:

NSArray *tempFavoritesArray = [appPreferences arrayForKey:[NSString stringWithFormat:@"%@ %@ favorites", server, project]];
favoritesArrayDisplay = [[NSMutableArray alloc] initWithObjects:nil];
cenXsArray = [[NSMutableArray alloc] initWithObjects:nil];
cenYsArray = [[NSMutableArray alloc] initWithObjects:nil];
viewScalesArray = [[NSMutableArray alloc] initWithObjects:nil];
currentPresetsArray = [[NSMutableArray alloc] initWithObjects:nil];
rastersArray = [[NSMutableArray alloc] initWithObjects:nil];
empty = NO;
selected = NO;

if ([tempFavoritesArray count] == 0 || tempFavoritesArray == nil)
{
    [favoritesArrayDisplay addObject:@"No favorites saved."];
    empty = YES;
}

for (int i=0; i<[tempFavoritesArray count]; i++)
{
    NSString *tempFavString = [NSString stringWithString:[tempFavoritesArray objectAtIndex:i]];
    NSArray *tempFavs = [tempFavString componentsSeparatedByString:@"|"];        

    if ([tempFavs count] > 2)
    {
        [favoritesArrayDisplay addObject:[tempFavs objectAtIndex:0]];
        [cenXsArray addObject:[tempFavs objectAtIndex:1]];
        [cenYsArray addObject:[tempFavs objectAtIndex:2]];
        [viewScalesArray addObject:[tempFavs objectAtIndex:3]];
        [currentPresetsArray addObject:[tempFavs objectAtIndex:4]];
        [rastersArray addObject:[tempFavs objectAtIndex:5]];
    }
}

Кто-нибудь видел это раньше?

Ответы [ 3 ]

5 голосов
/ 23 августа 2011

Все утечки говорят вам, что объект или объекты, выделенные этой строкой кода, позже просочились . Он показывает не строку кода, которая вызвала фактическую утечку, а строку кода, которая создала выделение, которое было позже просочилось.

т.е. возможно, вы чрезмерно сохраняете одну из строк в массиве tempFavs, и утечка идентифицирует ее как утечку.

Сначала попробуйте "построить и проанализировать". Если это не решит проблему, используйте инструмент «Распределение», чтобы точно определить, какой объект был обнаружен и где он был оставлен / выпущен.

1 голос
/ 23 августа 2011

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

0 голосов
/ 24 августа 2011

Ничего не видел о компонентахSeparatedByString, увеличивающих счетчик хранения, но вы уверены, что не сохраняете ни одного NSArray где-то еще в классе?

...