Утечка памяти при обновлении табличного представления с сохранением iOS - PullRequest
1 голос
/ 08 июня 2011

Большинство утечек памяти я решил сам, но этот довольно сложный, по моему мнению. Происходит следующее Мне нужно загрузить информацию из Facebook в табличном представлении, это табличное представление имеет функцию обновления. Все строки в этом tablview загружаются из массива, этот массив состоит из объектов данных, поскольку они должны быть отсортированы. Мой код выглядит следующим образом (я вырезал ненужные части).

Эта часть просматривает результаты из Facebook и помещает их в массив

- (void)request:(FBRequest*)request didLoad:(id)result
{
    if ([result isKindOfClass:[NSDictionary class]]) {  
        //Setting single result into result dictionary
        NSArray *resultArray = [result allObjects];
        result = [resultArray objectAtIndex:0];

        for(int i=0; i<13; i++){  
            //Set all retrieved data in containerArray
           Post *newPost = [[[Post alloc] init] autorelease];
            newPost.created_time = created_time1;
            newPost.message = message1;
            newPost.picture = picture1;
            newPost.fbSource = fbSource1;
            [containerArray insertObject:newPost atIndex:i];

            //Reload the table in the tableView
            [self.tableView reloadData];   
        } 
        NSSortDescriptor *sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"created_time" 
                                                                        ascending:NO] autorelease ];    

        sortedArray = [containerArray sortedArrayUsingDescriptors:[NSMutableArray arrayWithObject:sortDescriptor]];      
        [sortedArray retain];
    }
}

Пока это работает и не дает утечек памяти. Но как только функция обновления будет вызвана. Эта функция снова запустится. И затем создает утечку памяти, я думаю, вероятно, из-за функции [sortedArray retain]. Но без этой функции массив не загружается, и я получаю EXC_BAD_ACCESS. Если я освобождаю sortedArray, я также получаю EXC_BAD_ACCESS, так как sortedArray ушел и не может быть вызван.

Кто-то знает, как это исправить? Thnx!

Ответы [ 2 ]

4 голосов
/ 08 июня 2011

Ваш диагноз правильный.Если вы присваиваете значение sortedArray во второй раз, как вы делаете, предыдущий объект просачивается.

Решение вызывает release перед выполнением назначения:

    [sortedArray release];
    sortedArray = [containerArray sortedArrayUsingDescriptors:[NSMutableArray arrayWithObject:sortDescriptor]];      
    [sortedArray retain];

Более элегантным решением было бы объявить sortedArray в качестве сохраняющего свойства:

   @property (nonatomic, retain) NSArray* sortedArray;

, чтобы вы могли заменить три строки выше на:

    self.sortedArray = [containerArray sortedArrayUsingDescriptors:[NSMutableArray arrayWithObject:sortDescriptor]];      

, и это будет обрабатывать обаосвобождает и удерживает должным образом.

1 голос
/ 08 июня 2011
sortedArray = [containerArray sortedArrayUsingDescriptors:[NSMutableArray arrayWithObject:sortDescriptor]];

Эта строка запускается впервые, и это нормально. Но запустите второй раз, и вы указываете на новый массив, пропуская предыдущий. Так что есть два решения.

Во-первых, отпустите его перед этой строкой так:

[sortedArray release];    
sortedArray = [containerArray sortedArrayUsingDescriptors:[NSMutableArray arrayWithObject:sortDescriptor]];
[sortedArray retain];

Или сделайте sortedArray сохраненным свойством в вашем классе.

@property (nonatomic, retain) NSArray *sortedArray;

self.sortedArray = [containerArray sortedArrayUsingDescriptors:[NSMutableArray arrayWithObject:sortDescriptor]];
...