2013-03-19 2 views
0

많은 개체가 NSMutableArray (> 2500)에 있고이를 저장할 때 응용 프로그램이 충돌합니다 (메모리 경고 x3 수신). 여기 saveContext 방법백그라운드 스레드에 데이터를 저장할 때받은 메모리 경고

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

UPDATE

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]; 
    } 

: 나는 방법에 코드를 추가하고 거기에 당신이 있습니다.

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

언제 메모리 경고를 받습니까? 다른 세부 정보를 게시하십시오. –

답변

0

NSURLRequest에서 2500 명이 넘는 고객이 반환 된 것으로 보입니다. cust 배열을 채울 때까지 네 개의 데이터 복사본이 있습니다 (NSData, NSString, NSMutableArray 및 NSManagedObjectContext).

@autoreleasepool을 사용하여 NSData 및 NSString 변환을 래핑하십시오. -JSONValue 통화를 완료하면 더 이상 해당 표현이 필요하지 않습니다.

그런 다음 처리 루프도 @autoreleasepool에 랩핑하십시오. 그러면 중간 결과 (볼 수없는 것들까지도)를 해제 할 수 있습니다.

마지막으로 saveContext를 수행 할 때 관리 객체 컨텍스트에서도 -reset을 수행하십시오. 당신을 위해

다른 두 노트 : 4가 잘못된 줄에 NSError 매개 변수의

수표. NSError ** 매개 변수가있는 메서드의 경우 작업이 성공하면 NSError 반환 값이 정의되지 않습니다. 논리는 if (data.length > 0)이어야하며 계속 진행해야합니다. 그렇지 않으면 NSError를 검사합니다. NSURLConnection 클래스 참조를 참조하십시오.

또한 getClassById 메서드는 Cocoa 명명 표준을 위반 한 것으로 보입니다. 메서드가 단어 get으로 시작하면 매개 변수에서 참조로 결과를 반환해야합니다. https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingMethods.html#//apple_ref/doc/uid/20001282-BCIGIJJF을 참조하십시오.

+0

감사합니다. 메모리 누수 문제가 해결되었습니다. 그러나 순환 보존에서 모두 똑같이 천천히 그리고 천천히 진행됩니다. 데이터 저장 프로세스를 어떻게 가속화 할 수 있습니까? –

+0

실제로 느린'saveContext' 호출입니까? 아니면 다른 부분? 이것은 Instruments를 실행시키고'com.apple.CoreData.SQLDebug'을 켜는 좋은 시간이 될 것입니다. (http://useyourloaf.com/blog/2010/03/11/debugging-core-data-on- the-iphone.html). 잘못된 이름의'getClassById : error'가 일부 반복에서 두 번 호출된다는 것을 알았습니다. 그것은 무엇을합니까? –

관련 문제