2013-03-19 46 views
0

我在NSMutableArray(> 2500)中有很多對象,當我保存它時,應用程序崩潰(收到內存警告x3)。將數據保存到後臺線程時收到內存警告

NSLog(@"start"); 
    NSInteger saveTemp = 0; 
    NSData *data = [NSURLConnection sendSynchronousRequest:req returningResponse:&response error:&err]; 
    if ([data length] > 0 && err == nil) 
    { 
     MyClass* rcust; 
     NSString *respStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
     NSMutableArray* cust = [respStr JSONValue]; 
     for(NSDictionary *v in cust) 
     { 
      if([dataProvider getClassById:[[v valueForKey:@"Id"] integerValue] error:nil] == nil) 
      { 
       rcust = [dataProvider createClass]; 
       rcust.clsId = [v valueForKey:@"Id"]; 
      } 
      else 
      { 
       rcust = [dataProvider getClassById:[[v valueForKey:@"Id"] integerValue] error:nil]; 
      } 
      rcust.cstZip = [v valueForKey:@"Zip"] == [NSNull null]? @"": [v valueForKey:@"Zip"]; 

      saveTemp++; 
      if(saveTemp > 1000) 
      { 
       NSLog(@"save"); 
       [dataProvider saveContext]; 
       saveTemp = 0; 
      } 
     } 
     [dataProvider saveContext]; 
    } 

這裏saveContext方法

- (void)saveContext { 
    NSError*err = nil; 
    if(![[self managedObjectContext] save:&err]) 
    { 
     NSLog(@"Unresolved error %@, %@", err, [err userInfo]); 
    } 
} 

更新: 我添加代碼的方法和有你。

2013-03-21 15:18:54.641 start 
2013-03-21 15:19:31.843 save 
2013-03-21 15:23:21.126 save 

即數據保存變慢,一段時間後,應用程序崩潰。

+0

您何時收到內存警告?嘗試發佈一些其他細節。 – 2013-03-20 20:55:40

回答

0

因此,看起來您有> 2500個客戶從該NSURLRequest返回。當你填充cust數組時,你有這些數據的四個副本(如NSData,NSString,NSMutableArray和NSManagedObjectContext)。

使用@autoreleasepool包裝你的NSData和NSString轉換。一旦你完成了你的-JSONValue電話,你不再需要這些表示。

然後,將你的處理循環包裝在@autoreleasepool中。這將允許中間結果(甚至是你看不到的結果)被釋放。

最後,當您執行saveContext時,還要對託管對象上下文執行一個 - 重置。其他

兩個音符您:

你的行中的NSError參數4是不正確的檢查。對於具有NSError **參數的方法,如果操作成功,則NSError返回值未定義。邏輯應該是if (data.length > 0)然後繼續,否則檢查NSError。請參閱NSURLConnection的類參考。

此外,您的getClassById方法似乎違反可可命名標準。如果方法以單詞get開始,它必須通過參數返回其結果。請參閱https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingMethods.html#//apple_ref/doc/uid/20001282-BCIGIJJF

+0

謝謝。它解決了內存泄漏的問題。但在循環保存中,所有這些都變得更加緩慢和緩慢。我如何加快數據保存過程? – 2013-03-29 16:54:58

+0

它實際上是緩慢的'saveContext'調用嗎?還是其他部分?這將是啓動Instruments的好時機,並打開「com.apple.CoreData.SQLDebug」(請參閱​​http://useyourloaf.com/blog/2010/03/11/debugging-core-data-on-在-iphone.html)。我注意到你的錯名'getClassById:error'在一些迭代中被調用兩次。它有什麼作用? – 2013-03-29 18:50:59