在CoreData中使用NSManagedObject时出现内存问题

时间:2014-09-03 10:34:45

标签: ios iphone core-data memory-leaks

我在iPad应用程序中使用Core Data来存储详细信息。应用程序为用户提供了一个选项,以XML的形式将保存的详细信息(在CoreData中)备份到其不同的云服务。为此,应用程序使用以下逻辑来创建XML字符串

  1. 从ManagedObjectContext中获取所有已保存的详细信息。

  2. 遍历数组中的所有项,从这些ManagedObject及其属性值创建格式化的XML字符串。

     NSString *contentFormat = @"";
    
     for(FolderItem *folder in contentArray) {
      contentFormat = [contentFormat stringByReplacingOccurrencesOfString:@"_Title_"
                                                                 withString:folder.title];
    
        contentFormat = [contentFormat stringByReplacingOccurrencesOfString:@"_Identifier_"
                                                                 withString:folder.identifier];
    
    
    
    contentFormat = [contentFormat stringByReplacingOccurrencesOfString:@"_Shared_"
                                                             withString:[NSString stringWithFormat:@"%d",[folder.shared integerValue]]];
    
    if ([folder.contentUrl length]) {
        contentFormat = [contentFormat stringByReplacingOccurrencesOfString:@"_ContentUrl_"
                                                                 withString:folder.contentUrl];
    
    }else {
        contentFormat = [contentFormat stringByReplacingOccurrencesOfString:@"_ContentUrl_"
                                                                 withString:@""];
    }
    
      }
    
  3. 但是当处理大量(大约15k)的CoreData对象时,应用程序崩溃时出现错误“应用程序因内存错误而终止”。

    有没有人有同样的经历?

    请分享您的建议。

    提前致谢。

2 个答案:

答案 0 :(得分:0)

  1. 检查您的iPhone内存。一些应用程序在后台运行,因此会发生。

  2. 检查iPhone中的免费存储空间。

  3. 参考下面的链接:

    What is maximum storage capacity of Core Data?

答案 1 :(得分:0)

虽然ARC中局部变量一旦超出范围就会被释放,但是指针可能仍然没有及时释放,特别是在循环中。 @autoreleasepool{ }将确保在块结束时释放它们。

所以试着把循环体放在@autoreleasepool { ... }中;并将NSString *contentFormat = @"";放入@autoreleasepool块。