2015-05-25 73 views
2

我想備份一個核心數據SQLite數據庫。此代碼成功處理正在運行的數據庫併合並WAL文件。不幸的是,每次運行時,我都會在內存佔用空間中看到大約3-5 MB的凹凸。程序運行一段時間後,這會導致問題。有人可以幫我回收內存嗎?我認爲將所有東西都設置爲零將從RAM中釋放所有的對象,但似乎並不是這樣。在iOS中的核心數據內存足跡不斷增加

-(void) backupDatabaseWithThisTimeStamp: (int) timeStamp withCompletionBlock:(void (^)(void))completion { 
    NSDate *backupDate = [NSDate date]; 
    NSError *error; 

    [self.defaultPrivateQueueContext save:&error]; 
    if (error) { 
     NSLog(@"error -> %@",error); 
    } 
    dispatch_async(self.backupQueue, ^{ 
     // Let's use the existing PSC 
     NSPersistentStoreCoordinator *migrationPSC = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 

     // Open the store 
     id sourceStore = [migrationPSC addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[self persistentStoreURL] options:nil error:nil]; 

     if (!sourceStore) { 
      NSLog(@" failed to add store"); 
      migrationPSC = nil; 
     } else { 
      NSLog(@" Successfully added store to migrate"); 

      NSError *error; 
      NSLog(@" About to migrate the store..."); 
      id migrationSuccess = [migrationPSC migratePersistentStore:sourceStore toURL:[self backupStoreURLwithTimeStamp: timeStamp] options:[self localStoreOptions] withType:NSSQLiteStoreType error:&error]; 

      if (migrationSuccess) { 
       NSLog(@"store successfully backed up"); 
       // Now reset the backup preference 
       NSManagedObjectContext *tempContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
       tempContext.persistentStoreCoordinator = migrationPSC; 
       tempContext.undoManager = nil; 

       // clip out data 
       [CDrawColorData purgeDataOlderThan:backupDate fromContext:tempContext]; 

       migrationPSC = nil; 
       tempContext = nil; 
      } 
      else { 
       NSLog(@"Failed to backup store: %@, %@", error, error.userInfo); 
       migrationPSC = nil; 
      } 
     } 
     migrationPSC = nil; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      if (completion) { 
       completion(); 
      } 
     }); 
    }); 
} 

self.backupQueue = _backupQueue = dispatch_queue_create("backup.queue", DISPATCH_QUEUE_SERIAL); 

localStoreOptions = 
- (NSDictionary*)localStoreOptions { 
    return @{NSMigratePersistentStoresAutomaticallyOption:@YES, 
     NSInferMappingModelAutomaticallyOption:@YES, 
     NSSQLitePragmasOption:@{ @"journal_mode" : @"DELETE" }}; 
} 

註釋掉migrationSuccess點之後出現這種情況不會影響內存佔用的一切。

回答

1

我見過的所有問題都直接對Xcode Scheme負責。 產品展示 - >方案 選擇運行選項取消選中 - >隊列調試(啓用原路返回錄音)

一旦這樣做,所有的內存佔用增長的立即消失。

+0

哇,我不知道你是怎麼想出來的,但是這似乎也解決了我的問題。內存佔用量將無限增長(超過1GB),現在可以輕鬆生活在25MB。 –

0

由於太少代表我在寫這作爲一個「答案」(即使它可能不是溶液):我認爲這是考慮「CACHE_SIZE」良好做法作爲另一個NSSQLitePragmasOption並限制其因此:

NSSQLitePragmasOption:@{ @"journal_mode" : @"DELETE", @"cache_size" : @"50"}

看到www.sqlite.org的聲明

0

我認爲這很可能是因爲在覈心數據對象圖的所有關係都是強引用。所以你們都保證保留週期。對於進一步的診斷,您應該使用儀器的泄漏工具並查看哪種類型的物體泄漏。

因此,在丟棄它們之前,您可能希望在創建NSManagedObjectContext的任何實例上調用reset。這將強行斷開所有活動對象,從而破壞任何保留週期(除非您自然再次訪問對象)。 dealloc自動提示reset並不明確在文檔中,因此它似乎不是合同保證。