开发者

CoreData leaks with fetched results arrays

开发者 https://www.devze.com 2023-03-14 09:03 出处:网络
I\'m using CoreData to store objects like cars, trips, data recorded from GPS, etc. When I fetch what I want to show a list of trips, some stats for a trip, or add a new car in my settings view contro

I'm using CoreData to store objects like cars, trips, data recorded from GPS, etc. When I fetch what I want to show a list of trips, some stats for a trip, or add a new car in my settings view controller, I use pretty much this kind of request:

- (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.mana开发者_如何学运维gedObjectContext 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];
}

Sometimes, I have leaks when I do the [self setDataTripArray:mutableFetchResults]; and sometimes not. In this case, when I get the data for a trip, it leaks all the time when I use the navigation controller to come back to the root view controller (displaying a list of trips), and/or when I change tab.

Anyway, it just leaks and it's all the time coming from fetching data from CoreData, and give this array to my local array var.

Please let me know if you see how to fix this! It made the app crash after a while. Thanks!


SOLUTION

I found that I do a retain on my object dataTripArray object when creating another UIViewController that I use to create graphs for my scroll view.

- (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];
    }
}

I just removed the retain and the leak is no longer coming up. Fixed!

0

精彩评论

暂无评论...
验证码 换一张
取 消