0

이 질문에 대한 만족스러운 답변을 찾을 수 없어 새로운 질문을 작성했습니다.NSManagedContext의 메모리 지우기 (생성 후 메모리 해제)

코어 데이터 DB에 데이터를 채울 때 처음으로 앱을 시작할 때 크기가 매우 큽니다 (약 10MB). 여러 파일이있어 모두를 코어 데이터에 삽입해야합니다.

지금 내 문제는 4or5 MB를 처리 한 후 메모리 경고가 표시됩니다. 생성 된 엔티티는 여전히 살아있는 것처럼 보이고 데이터 덩어리가 완성되면 즉시 지우고 싶습니다 (각 파일 이후에 지울 수있는 여러 파일이기 때문에).

이 문제로 인해 프로세스가 완료되지 않으며 메모리 과부하로 인해 항상 충돌합니다.

iPad 미니와 최신 xcode 및 ARC를 사용하고 있습니다.

도움을 주시면 감사하겠습니다.

+0

코어 데이터는 "폴트링 (faulting)"이라는 개념을 사용하여 객체 그래프에 사용되는 메모리를 관리합니다. 귀하의 응용 프로그램은 무엇이 잘못되었는지 무엇이 그렇지 않은지 완전하게 통제합니다. https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreData/Articles/cdFaultingUniquing.html – quellish

답변

0

먼저 페이지를로드하기 전에 모든 개체를 삭제하십시오. 삭제 후 핵심 데이터에있는 모든 객체의 데이터를 삽입하십시오.

- (void) deleteAllObjects: (NSString *) entityDescription { 


    LoginAppDelegate* appDelegate = [UIApplication sharedApplication].delegate; 
    self.managedObjectContext = appDelegate.managedObjectContext; 

    NSManagedObjectContext *context =[appDelegate managedObjectContext]; 

    NSEntityDescription *entityDesc =[NSEntityDescription entityForName:entityDescription 
              inManagedObjectContext:context]; 

    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setEntity:entityDesc]; 

    NSError *error; 
    NSArray *items = [self.managedObjectContext executeFetchRequest:request error:&error]; 

    for (NSManagedObject *managedObject in items) { 
     [managedObjectContext deleteObject:managedObject]; 
     //NSLog(@"%@ object deleted",entityDescription); 
    } 
    if (![managedObjectContext save:&error]) { 
     //NSLog(@"Error deleting %@ - error:%@",entityDescription,error); 
    } 

} 

- (void)parserDidEndDocument:(NSXMLParser *)parser 
{ 

    [self deleteAllObjects:@"Data"]; 
    //do ur code 
    [self insertYourData]; 
} 
0

왜 당신은 단순히 데이터 (어쩌면 하나의 엔티티 만)하고, 저장 전무로 설정하고 다른 하나를 만들 수의 일부를 임시 컨텍스트를 만들 삽입하지 마십시오? 또는 "재설정"메서드를 사용하려고 할 수도 있지만 시도한 적이 없지만 컨텍스트가 모든 개체를 "잊어 버리는"것으로 이해하므로 개체를 할당 해제하는 것처럼 작동해야합니다.

+0

나는 그 (것)들을 시도하고 그러나 기억을 맑게하는 것을 보이지 않았다, 그래서 나는 autorelease에있는 스 니펫을 포함해서 그것을 해결했다 블록. 이제 블록을 종료 한 직후 메모리가 지워집니다. – RVN