核心数据与iCloud导致低内存警告和崩溃,内存使用量不断增长
我正在开发一个小型的业务应用程序,并且遇到了一个奇怪的内存问题,这个问题只有在使用Core Data和iCloud的时候才会出现。 如果我切换应用程序使用本地存储,随着时间的推移内存使用情况就好(通常17-18Mb)。
当我使用iCloud的应用程序,应用程序不断地使用越来越多的内存(每秒添加大约4-5Mb),直到它崩溃。
我已经做了一些与仪器分析,但无法弄清楚为什么会发生这种情况。 有没有人有任何想法如何开始寻找解决scheme?
下面是一个屏幕截图,显示了应用程序使用了多less内存,以及如何增长是线性的。 截图后,该应用程序崩溃了几秒钟。
以下是来自Core Data堆栈设置的一些代码。
NSString *iCloudEnabledAppID = @"iCloudData"; NSString *dataFileName = @"Moviedo.sqlite"; NSString *iCloudDataDirectoryName = @"Data.nosync"; NSString *iCloudLogsDirectoryName = @"Logs"; NSFileManager *fileManager = [NSFileManager defaultManager]; NSURL *iCloud = [fileManager URLForUbiquityContainerIdentifier:nil]; NSPersistentStoreCoordinator *psc = self.managedObjectContext.persistentStoreCoordinator; NSString *iCloudData = [[[iCloud path] stringByAppendingPathComponent:iCloudDataDirectoryName] stringByAppendingPathComponent:dataFileName]; NSURL *iCloudLogsPath = [NSURL fileURLWithPath:[[iCloud path] stringByAppendingPathComponent:iCloudLogsDirectoryName]]; NSURL *storeURL = [NSURL fileURLWithPath:iCloudData]; NSDictionary *options = @{ NSMigratePersistentStoresAutomaticallyOption: @(YES), NSInferMappingModelAutomaticallyOption: @(YES), NSPersistentStoreUbiquitousContentNameKey: iCloudEnabledAppID, NSPersistentStoreUbiquitousContentURLKey: iCloudLogsPath }; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ if (iCloud) { DDLogInfo(@"iCloud is working"); if([fileManager fileExistsAtPath:[[iCloud path] stringByAppendingPathComponent:iCloudDataDirectoryName]] == NO) { NSError *fileSystemError; [fileManager createDirectoryAtPath:[[iCloud path] stringByAppendingPathComponent:iCloudDataDirectoryName] withIntermediateDirectories:YES attributes:nil error:&fileSystemError]; if(fileSystemError != nil) { NSLog(@"Error creating database directory %@", fileSystemError); } } DDLogVerbose(@"iCloudData = %@", iCloudData); NSError* error; if (! [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) { DDLogError(@"Error creating iCloud data store: %@",error); abort(); } } else { [self setupLocalStorage]; } });
这里是一些仪器的截图。 我让应用程序运行了大约2分钟。 最终的内存使用量是453Mb。 请注意,我手动停止录制,应用程序没有崩溃。
当我打开前4个符号名称中的3个(按字节使用sorting)时,调用树中似乎还有很多 PFUbiquity*
调用。 再次,不确定我能用这些信息做什么。