【问题标题】:CoreData leaks with fetched results arraysCoreData 泄漏与获取的结果数组
【发布时间】:2011-09-18 21:59:17
【问题描述】:

我正在使用 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。

如果您知道如何解决此问题,请告诉我!一段时间后,它使应用程序崩溃。 谢谢!

【问题讨论】:

  • setDataTripArray 是保留属性的访问者吗?如果是,你会在你的dealloc 方法中释放它吗?
  • 是的。这是 var 声明 @property (nonatomic, retain) NSMutableArray *dataTripArray;。哦,我刚刚发现它可能来自哪里,我更新了我的帖子,你可以看到。
  • 太棒了!以后请记住 Instruments 指向泄漏对象的创建位置,而不是泄漏对象的位置。顺便说一句,可以回答您自己的问题而不是编辑问题:)
  • 谢谢@albertamg!我总是使用 Instruments 进行泄漏和内存分配,是的,但它指向 [self setDataTripArray:mutableFetchResults];,而不是稍后在我课堂上的 retain。我还有一些其他漏洞,但我会找到我猜的方法:)

标签: arrays ios core-data memory-leaks


【解决方案1】:

解决方案

我发现在创建另一个用于为滚动视图创建图形的 UIViewController 时,我在对象 dataTripArray 对象上做了一个 retain

- (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,泄漏不再出现。已修复!

【讨论】:

  • +1 听从我的建议并回答您自己的问题,而不是编辑原始问题
猜你喜欢
  • 2011-02-21
  • 2011-05-31
  • 1970-01-01
  • 2012-03-07
  • 1970-01-01
  • 2017-09-07
  • 1970-01-01
  • 2011-10-22
  • 2015-07-17
相关资源
最近更新 更多