小编qua*_*ark的帖子

我没有在新版本中迁移NSPersistentStore,我可以通过应用更新进行恢复吗?

长话短说,我的核心数据架构已经更改,我的应用程序已提交到应用程序商店,这导致更新应用程序的所有人崩溃.崩溃是NSPersistentStore由于未正确迁移数据模型而导致丢失.

我仍然在文档目录中看到.sqlite和相关的数据库文件,如果我降级到旧版本,一切都可以正常使用所有数据.我的问题是,我可以通过以某种方式迁移现有的NSPersistentStore并将其添加到NSPersistentStoreCoordinator来更新应用程序吗?

编辑:所以我自己并没有真正改变我的xcdatamodel,因此,"长话短说".但是,我确实从我的项目中删除了XMPPFramework,我觉得这可能会导致核心数据问题.

编辑:
我没有直接对我的数据模型进行任何更改,但我已经确定了问题所在.我正在检索我的NSManagedObjectModel使用[NSManagedObjectModel mergedModelFromBundles:nil],它合并了捆绑包中的所有数据模型.这包括XMPPFramework附带的所有数据模型,现在框架已被删除,传入的NSManagedObjectModel [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel]是不同的,从而导致崩溃.

我通过使用FMDB获取现有数据库的内容解决了这个问题,然后创建了一个新的sqlite文件,并将持久存储协调器指向该新的sqlite文件.然后我通过循环现有数据并创建适当的NSManagedObjects,将所有现有数据插入到新数据库中.我也停止使用mergedModelFromBundles检索我的数据模型而是使用initWithContentsOfURL.

sqlite core-data core-data-migration ios

12
推荐指数
1
解决办法
2134
查看次数

CMSampleBufferRef上的CFRelease - 为什么我需要调用它?

CMSampleBufferRef sampleBuffer = [assetOutput copyNextSampleBuffer];
CMBlockBufferRef buffer = CMSampleBufferGetDataBuffer(sampleBuffer);
CMBlockBufferAppendBufferReference(_sem == 0 ? _buffer0 : _buffer1, buffer, 0, 0, 0);
//if(sampleBuffer)
//    CFRelease(sampleBuffer);
Run Code Online (Sandbox Code Playgroud)

为什么这会导致第一行的内存泄漏(至少是Leaks所说的那样)?我有我的assetOutput.shouldAlwaysCopySampleOutput = NO.以下是我对情况的理解:

CMSampleBufferRef sampleBuffer = [assetOutput copyNextSampleBuffer];
Run Code Online (Sandbox Code Playgroud)

这条线将创建一个参考从assetOutput的样品缓冲液.

CMBlockBufferRef buffer = CMSampleBufferGetDataBuffer(sampleBuffer);
Run Code Online (Sandbox Code Playgroud)

这一行将从CMSampleBuffer获取CMBlockBuffer,但不会分配新缓冲区,在这种情况下,Get方法意味着它是一个临时(自动释放)缓冲区

CMBlockBufferAppendBufferReference(_sem == 0 ? _buffer0 : _buffer1, buffer, 0, 0, 0);
Run Code Online (Sandbox Code Playgroud)

该行将上面创建的CMBlockBuffer 的引用附加到选定的全局范围缓冲区.它不会复制任何内存块.

因此,在这三行中,我都不会分配任何内存,也不会复制任何内存,这些都是引用.我不明白泄漏的来源.我尝试添加注释掉的行,它似乎仍然泄漏(尽管次数较少)

memory iphone memory-leaks ios

3
推荐指数
1
解决办法
2296
查看次数