Утечка CoreData с массивами полученных результатов - PullRequest
0 голосов
/ 20 июня 2011

Я использую CoreData для хранения таких объектов, как автомобили, поездки, данные, записанные с GPS и т. Д. Когда я получаю то, что я хочу, чтобы показать список поездок, некоторую статистику поездки или добавить новую машину в моем контроллере просмотра настроек, я использую в значительной степени такой запрос:

- (void)getDataTrip
{
    // Fetched data trips.
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"DataTrip" inManagedObjectContext:[self managedObjectContext]];
    [fetchRequest setEntity:entity];

    // Set predicate and sort orderings...
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"timestamp" ascending:YES];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
    [fetchRequest setSortDescriptors:sortDescriptors];
    [sortDescriptors release];
    [sortDescriptor release];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"idTrip = %@", self.idTrip];
    [fetchRequest setPredicate:predicate];

    // Execute the fetch -- create a mutable copy of the result.
    NSError *error = nil;
    NSMutableArray *mutableFetchResults = [[self.managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy];
    if (mutableFetchResults == nil) {
        // Handle the error.
        NSLog(@"failed with error: %@", error);
    }

    // Set the array.
    [self setDataTripArray:mutableFetchResults];

    // Memory management.
    [fetchRequest release];
    [mutableFetchResults release];
}

Иногда у меня возникают утечки, когда я делаю [self setDataTripArray:mutableFetchResults];, а иногда нет. В этом случае, когда я получаю данные для поездки, она все время протекает, когда я использую контроллер навигации, чтобы вернуться к корневому контроллеру представления (отображая список поездок), и / или когда я меняю вкладку. *

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

Пожалуйста, дайте мне знать, если вы видите, как это исправить! Через некоторое время приложение зависло. Спасибо!

1 Ответ

1 голос
/ 20 июня 2011

РЕШЕНИЕ

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

- (void)loadScrollViewWithPage:(int)page
{
    if (page < 0)
        return;
    if (page >= kNumberOfPages)
        return;

    // Replace the placeholder if necessary.
    GraphController *controller = [self.graphControllers objectAtIndex:page];
    if ((NSNull *)controller == [NSNull null])
    {
        controller = [[GraphController alloc] initWithPageNumber:page data:[self.dataTripArray retain]];
        [self.graphControllers replaceObjectAtIndex:page withObject:controller];
        [controller release];
    }

    // Add the controller's view to the scroll view.
    if (controller.view.superview == nil)
    {
        CGRect frame = _scrollView.frame;
        frame.origin.x = frame.size.width * page;
        frame.origin.y = 0;
        controller.view.frame = frame;
        [self.scrollView addSubview:controller.view];
    }
}

Я только что удалил retain, и утечка больше не идет.Исправлено!

...