Утечка памяти после второго просмотра таблицы - PullRequest
0 голосов
/ 13 апреля 2011

У меня есть два UITableViewControllers.Я нажимаю на второй и вызываю следующий метод в viewDidLoad.

Во второй раз, когда я избавляюсь от этого представления и возвращаюсь к первому виду, я получаю утечку памяти.Инструментарий говорит, что проблема в последней строке следующего метода.

- (void)fetchRecords {   

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:[NSEntityDescription entityForName:@"Articulation" inManagedObjectContext:[self managedObjectContext]]];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"articulationGroup == %@", selectedArticulationGroup];
    [request setPredicate:predicate];

    static NSArray *sortDescriptors = nil;
    if (!sortDescriptors)
        sortDescriptors = [[NSArray alloc] initWithObject:[[[NSSortDescriptor alloc] initWithKey:@"text" ascending:NO] autorelease]];
    [request setSortDescriptors:sortDescriptors];

    NSError *error = nil;
    NSArray *fetchResults = [managedObjectContext executeFetchRequest:request error:&error];
    if (!fetchResults)
        NSLog(@"no fetch results ArticulationsViewController, error %@", error);
    [request release];

    self.articulationsArray = [NSMutableArray arrayWithArray:fetchResults];

}

Я понятия не имею ... ложусь спать: '(

Ответы [ 5 ]

1 голос
/ 13 апреля 2011

Во-первых, вы теряете массив sortDescriptors, если берете ветвь выделения. Я настоятельно рекомендую вам использовать фигурные скобки вокруг всех блоков if / else, даже если они содержат только одну строку - эти ошибки очень трудно найти после факта

Пожалуйста, опубликуйте свой метод dealloc и объявления ivar.

0 голосов
/ 14 апреля 2011

Ну ... я чувствую себя как гусь.

Когда я вернулся к своему первому tableViewController, я не выпускал articulationsArray.

Я использовал

- (void)viewDidUnload {
    [self.articulationsArray release];
}

Когда я должен был использовать:

-(void)viewDidDisappear:(BOOL)animated {
    [self.articulationsArray release];
}

ViewDidUnload, никогда не вызывался.

Спасибо всем за помощь.

0 голосов
/ 14 апреля 2011

Этот блок совершенно не нужен и опасен:

static NSArray *sortDescriptors = nil;
if (!sortDescriptors)
    sortDescriptors = [[NSArray alloc] initWithObject:[[[NSSortDescriptor alloc] initWithKey:@"text" ascending:NO] autorelease]];
[request setSortDescriptors:sortDescriptors];

Любой статический объект опасен для памяти, и вы используете его только в особых случаях.Зачем прибивать массив только локальной областью к определенному адресу / блоку?Все это можно заменить одной строкой:

[request setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortWithKey:@"text" ascending:NO]]];

... и все готово.

Эта строка, вероятно, не нужна и может вызвать проблемы позже:

self.articulationsArray = [NSMutableArray arrayWithArray:fetchResults];

Зачем вам нужен изменяемый массив извлекаемых объектов?Вы не можете реально добавлять или удалять что-либо из массива напрямую, сохраняя целостность вашего графика без повторной загрузки.

Просто:

self.articulationsArray = fetchResults;

будет работать нормально в большинстве случаев.

Чем больше объектов вы создаете, тем больше шансов на утечку.Сохраняйте вещи максимально простыми.

0 голосов
/ 13 апреля 2011

Почему ваш массив sortDescriptors статичен?Как правило, вы должны сделать что-то вроде этого:

NSSortDescriptor *textSort = [[NSSortDescriptor alloc] initWithKey:@"text" ascending:NO];

[fetchRequest setSortDescriptors:[NSArray arrayWithObject:textSort]];

[textSort release];

Кроме того, после if (!fetchResults) вы не должны сохранять свой массив, а делать что-то вроде этого:Вы можете установить articulationsArray по-другому.Всегда нужно быть осторожным с этими NSMutableArray s ...:)

0 голосов
/ 13 апреля 2011

Хорошо, я заметил две вещи, которые могли бы быть правильными, но я все равно хотел спросить о них.

Прежде всего, вы спрашиваете в утверждении if: if (!fetchResults).Это означало бы, что fetchResults возможно не существует.Тем не менее, вы пытаетесь инициализировать массив с этим.

Во-вторых, я не знаю, как вы разместили articulationsArray, но имеет ли какое-либо влияние изменение строки на self.articulationsArray = [[NSMutableArray alloc] initWithArray:fetchResults]]?

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