我是一名新的iOS開發人員。希望得到幫助。 我想能夠創建許多NSManagedObjects。一個NSManagedObject的字段大小約爲5Mb。我無法在iPhone內存中保存如此大量的內存。我想將它保存在數據庫中。但是當我保存NSManagedObject時,它仍然在內存中,因爲當我保存大約20個對象時,我收到內存警告並且應用程序崩潰。 這裏是我的代碼創建NSManagedObject(大尺寸)。內存警告和應用程序崩潰
- (void)SaveItem
{
NSString *entityName = kEntityName;
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = appDelegate.managedObjectContext;
NSEntityDescription *entityDesctiption = [NSEntityDescription
entityForName: entityName
inManagedObjectContext:context];
// check if town exists
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"id == %d", self.imageID];
NSFetchRequest *requestToCheckExistense = [[NSFetchRequest alloc] init];
[requestToCheckExistense setEntity:entityDesctiption];
[requestToCheckExistense setPredicate:predicate];
NSArray *objects = [context executeFetchRequest:requestToCheckExistense error:nil];
[requestToCheckExistense release];
if (objects == nil)
{
NSLog(@"there was an error");
}
NSManagedObject *object;
if ([objects count] > 0)
{
// edit item
object = [objects objectAtIndex:0];
}
else
{
// if object doesn't exist, find max id to imlement autoincrement
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entityDesctiption];
request.propertiesToFetch = [NSArray arrayWithObjects: @"id", nil];
NSArray *allobjects = [context executeFetchRequest:request error:nil];
[request release];
NSInteger newID = 1;
if ([allobjects count] > 0)
{
NSNumber *maxID = [allobjects valueForKeyPath:@"@max.id"];
newID = [maxID intValue] + 1;
}
// write item
object = [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:context];
[object setValue:[NSNumber numberWithInt:newID] forKey:@"id"];
self.imageID = newID;
}
// fill NSManagedObject
// size of objNSData is about 5MB
NSMutableData *objNSData = [[DatabaseManager sharedDatabaseManager] encryptedDataFromImage:bigImage];
[object setValue:objNSData forKey:@"big"];
[context save:nil];
}
當我嘗試調用[自我SaveItem] 20倍,應用程序崩潰與內存警告。當我評論了
[object setValue:objNSData forKey:@"big"];
一切正常。
我試着將代碼添加到@autoreleasepool,但沒有幫助。
我知道,現在,當我將數據保存到數據庫時,它仍然在iPhone內存中。如何從這個內存釋放它? 當我得到一組管理對象時,它們不在內存中(我可以輕鬆獲得100個對象,每個對象都有5Mb字段)
我試過你的方法來將每個循環執行包裝在自動釋放池中。這沒有幫助。 (實際上我試圖將autorelease池放在所有可能的代碼位置,這並沒有幫助,我甚至試圖說服NSManagedObject,這也沒有幫助)。 關於撤消管理器:我試圖將其設置爲無效,這沒有幫助。 現在我將嘗試在每次[self SaveItem]調用後調用[上下文保存],重置和回滾。希望它有幫助 –
是的,我在所有調用[self SaveItem]之後調用了[上下文保存],[上下文重置],[上下文保存],並且它解決了問題。謝謝。 –