arrays - CoreData 因获取的结果数组而泄漏

标签 arrays ios core-data memory-leaks

我使用 CoreData 来存储汽车、行程、GPS 记录的数据等对象。 当我获取想要显示的行程列表、行程的一些统计信息或在我的设置 View Controller 中添加新车时,我几乎使用这种请求:

- (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];时会出现泄漏,有时则不会。在这种情况下,当我获取行程数据时,当我使用导航 Controller 返回 Root View Controller (显示行程列表)和/或更改选项卡时,它会一直泄漏。

无论如何,它只是泄漏,并且一直来自从 CoreData 获取数据,并将这个数组提供给我的本地数组变量。

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

最佳答案

解决方案

我发现在创建另一个用于为 ScrollView 创建图形的 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,泄漏不再出现。已修复!

关于arrays - CoreData 因获取的结果数组而泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6415441/

相关文章:

arrays - 从 O(n) 中的数字序列中找到一个连续子序列的算法,其总和将是一个要求的数字 M

PHP 我有两个数组,我想从数组 1 中提取项目,如果它不在数组 2 中的话

ios - 在 AppDelegate 的 UI Bootstrap 代码中选择 Root View Controller (与 viewDidLoad 相比)

ios - 我无法使用 swift 3.0 编辑数据并将其保存到核心数据?

php - 如何将数组存储在数据库中?

javascript - 在A "Class"中定义一个函数并调用它来打印数组元素

ios - 生成 Pod 项目时出错 - Pod 安装

iphone - 如何启动 iPhone 应用程序使其不使用任何 nib 文件?

macos - 核心数据数组 Controller 绑定(bind): valueForUndefinedKey

arrays - 如何使用嵌套类型正确编写数据模型或在 Swift 中使用 CoreData