在此处输入图片说明

这是通过仪器运行我的应用程序时得到的。 它正在处理许多核心数据。 我可以看到这显然是不对的,但是我真的不知道该屏幕快照告诉我什么。 似乎是什么问题? 如果您有兴趣,可以使用以下简明代码:

    NSFetchRequest *oldFetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *oldEntryEntity = [NSEntityDescription entityForName:@"Entry"
                                                      inManagedObjectContext:oldContext];

    [oldFetchRequest setEntity:oldEntryEntity];

    int numberOfEntries = [oldContext countForFetchRequest:oldFetchRequest error:nil];

    int batchSize = 4;
    [oldFetchRequest setFetchLimit:batchSize];
    int offset = 0;

    while (numberOfEntries - offset > 0) {
        @autoreleasepool {
        [oldFetchRequest setFetchOffset:offset];
        NSError *error;
        NSArray *entries = [oldContext executeFetchRequest:oldFetchRequest error:&error];

        for (NSManagedObject *entry in entries) {
        @autoreleasepool {
            Entry *newEntry = [NSEntityDescription insertNewObjectForEntityForName:@"Entry"
                                                            inManagedObjectContext:newContext];

            newEntry.entryID = [entry valueForKey:@"entryID"];

            NSMutableOrderedSet *newMediaSet = [[NSMutableOrderedSet alloc] init];

            NSOrderedSet *mediaSet = [entry valueForKey:@"media"];

            int i = 0;

            for (NSManagedObject *media in mediaSet) {

                Media *newMedia = [NSEntityDescription insertNewObjectForEntityForName:@"Media"
                                                                inManagedObjectContext:newContext];

                newMedia.isInPhotoLibrary = [media valueForKey:@"isInPhotoLibrary"];
                newMedia.positionInEntry = [NSNumber numberWithDouble:i + 1];

                MediaImageData *imageData = [NSEntityDescription insertNewObjectForEntityForName:@"MediaImageData"
                                                                          inManagedObjectContext:newContext];

                imageData.data = [media valueForKey:@"originalImage"];

                newMedia.imageData = imageData;

                newMedia.entry = newEntry;
                [newMediaSet addObject:newMedia];

                i++;
            }

            newEntry.media = newMediaSet;


        }
        }

        [newContext save:&error];

        offset = offset + batchSize;
   }
}

编辑:我按照这里给出的建议,将其包装在@autoreleasepools中(我在上面进行了编辑),并且在发生这种情况后仍然崩溃:

http://cl.ly/image/1U2T2p3w1X2Z

它显然比第一次更深入了代码,但仍然崩溃。

#1楼 票数:2

在不讨论代码效率的情况下:
在外部循环(while)和内部循环(for)中,将代码包装在@autoreleasepool {}中。
否则,您仅分配大量内存,仅在外部事件循环到达循环结束时才释放它。

#2楼 票数:1

尝试将快速枚举( for循环)的内部包装在@autoreleasepool ,这会有所帮助。 当更改达到危险的内存消耗时,您还可以运行某种计数器将上下文保存在循环中。

当然,您确实有很多对象,请考虑优化数据结构。

#3楼 票数:1

首先,有关发布核心数据相关问题的一些建议。 几乎没有信息太多的事情。 当您省略细节时,由于存在许多可能的互动,因此人们很难为您提供帮助。

仅查看您发布的代码,就会留下很多问题。

我想查看按总体大小而不是分配数量排序的信息。 这样可以更轻松地告诉您内存的使用位置。 照原样,我看不到该图片在哪里使用了内存(然后,再次出现-旧眼睛-当我放大它时,它变得太模糊了)。

如果您认为它与核心数据有关,那么为什么不运行核心数据工具呢?

继续提供一些诊断帮助。

您的新MOC是直接连接到PSC还是具有父MOC。 如果它具有父MOC,则将保存内容仅推送到父MOC中,并将保留在内存中,直到保存内容保存到数据库中为止。

您的mediaSet中有多少个项目? 可能有很多这样的东西,它们可能会消耗内存。

您已将哪些参数应用于FetchRequest和MOC? 基于这些选项,MOC可以保留对象。 一种检查方法是记录每个MOC的保留/插入/删除/等集的计数。 通过记录这些内容,您可以查看MOC是否正在保留您认为不应该的内容。

然后,您可以知道是否需要刷新/重置MOC。

您可以作弊,然后在保存后调用[moc reset] ,但是最好能在执行前后查看这些数字,以便使自己确信内存在哪里。

进行更多调试。 给自己更多的信息,以便您可以做出明智的决定……这也将为我们提供更好的信息,以帮助您。

编辑

Oooops。 我删除了有关可能内存不足的注释。 我的老眼睛让我看不到那幅图像上的小字。

编辑

谢谢。 如何记录每个MOC的保留/插入/删除集的计数? - 安德鲁

的MOC有几种特性( registeredObjectsinsertedObjectsdeletedObjectsupdatedObjects提供一组匹配这些类别的对象)。 只需NSLog每个类别中的对象数。 对于每个MOC,您可以看到MOC随时间跟踪的对象数。

另外,启用核心数据工具。 他们确实提供了很多信息。

  ask by Andrew translate from so

未解决问题?本站智能推荐:

4回复

应用升级后核心数据关系丢失

我有一个棘手的问题,我无法找到答案。 我的数据模型结构如下: 版本1: 项目有很多地方 位置有很多项目 但错误的是,两者之间的倒数从未设定过。 版本2: 与上面相同,但现在设置了逆。 我的问题的一个例子如下: 在版本1中,我有两个拥有相同位置的项目。 当
2回复

如何通过删除App Update上的旧数据来迁移核心数据

嗨我要在appstore中更新我的iOS应用程序,此更新包含数据库更改,现在如何通过删除应用程序更新中现有版本的旧数据库来迁移现有核心数据 ? 我已经提到了核心数据迁移教程 核心数据迁移帖子 不幸的是没有用。 任何帮助都提前感谢
1回复

使用coredata准备app发布

我正在创建我的新项目的1.0版本。 我第一次使用coredata。 应用程序只使用1个模型,所有数据都将由用户提供(因此我不会在应用程序中加载任何数据)。 当然,我已经在不同分支上处理应用程序的更新,并在将来看到数据模型中的一些变化。 模型的变化只包括: 增加实体
1回复

重新开始并升级商店中的应用程序(新项目-CoreData)

我在商店中有一个带有CoreData模型的应用程序,我想完全更改该应用程序(删除一些垃圾,整理,新的CoreData模型等)。 因此,我想重新开始并创建新项目 ,当我尝试将商店中的旧应用程序升级到新应用程序时会发生什么? (我担心CoreData) 非常感谢
1回复

在核心数据标准迁移过程中应用崩溃,没有错误

尝试使用标准迁移更新核心数据时,该应用程序崩溃且没有错误消息。 它具有直到此为止的所有标准日志消息: 它停留了几秒钟,然后崩溃到主屏幕,没有更多日志消息。 崩溃之前的代码是: 然后它在此行崩溃: 它甚至没有达到那个未解决的错误行。
2回复

从应用商店更新后,应用崩溃并显示SQLite错误

从Appstore更新应用程序后,它始终会崩溃。 我得到的错误是, 为了解决这个问题,我遵循的步骤在解释这个职位 。 修复之后,我面临新的错误, 在我的应用程序的更新版本中,我刚刚将一些属性从integer 16更改为integer 32 ,仅此而已。 我不知道有其他解决方
2回复

轻量级核心数据迁移后,如何为现有实体的新属性设置默认值?

我已经在核心数据模型上成功完成了轻量级迁移。 我的自定义实体Vehicle收到了一个新属性'tirePressure',这是类型为double的可选属性,默认值为0.00。 从商店中获取“旧”车辆(在迁移发生之前创建的车辆)时,其“ tirePressure”属性的值为零。 (这是
1回复

Core Data轻量级迁移后执行自定义代码

我想知道在Core Data lightweight migration之后执行自定义代码时的最佳实践是什么。 假设我有3个版本的应用程序,我将尝试解释我的意思: 1.0.0版(核心数据模型版本为1.0) 版本1.1.0(核心数据模型版本为1.0) 2.0.0版(核心数据模型版