2012-09-24 3 views
0

나는 이것과 관련된 여러 가지 질문에 대해 비슷한 질문을 올렸지 만 지금은 약 1 주일 동안 아무런 노력을하지 않고 있습니다. 모든 것은이 코드까지 제공 :NSFetchRequest 메모리 문제

NSFetchRequest *oldFetchRequest = [[NSFetchRequest alloc] init]; 
     NSEntityDescription *oldEntryEntity = [NSEntityDescription entityForName:@"Media" 
                  inManagedObjectContext:oldContext]; 
     [oldFetchRequest setEntity:oldEntryEntity]; 
     [oldFetchRequest setFetchBatchSize:10]; 
     NSArray *medias = [oldContext executeFetchRequest:oldFetchRequest error:&error]; 

    int i = 0; 

    int count = [oldContext countForFetchRequest:oldFetchRequest error:nil]; 

    NSLog(@"count: %i", count); 

    while (i < count) { 
     @autoreleasepool { 
     NSManagedObject *media = [medias objectAtIndex:i]; 

      [oldContext refreshObject:media mergeChanges:NO]; 

     NSLog(@"i: %i", i); 
     i++; 
     } 
    } 

개수는 약 250, media 항목의 금액에 도달해야한다. 앱에 메모리가 부족하여 충돌이 발생하기 전에는 실제로 약 100에 도달합니다. 이 코드가 실행될 때마다 더 많은 메모리가 생성됩니다. 아마도 각각의 media에는 큰 NSData 속성이 포함되어 있기 때문입니다. 인스트루먼트는 코드가 실행될 때마다 메모리가 증가하는 것을 보여줍니다.

@autoreleasepool 및 이 문제를 해결하기 위해 추가되었지만 작동하지 않았습니다.

표준 마이그레이션이 대규모 데이터에서 작동하지 않으므로이 저장소의 모든 항목을 수동으로 새 항목으로 옮기려고합니다. 이것이 출발점입니다.

+0

은 마이그레이션하지 않고 코드가 다운되는 이유는 무엇입니까? 이 목록에있는 그대로? – NeverBe

+0

예, 이전 코드가 모두 제거되었습니다. 우리가 남긴 모든 코드는 위의 코드입니다. 나는 어떤 코드도 숨기지 않았다. – Andrew

+1

http://stackoverflow.com/questions/12295415/core-data-memory-usage-and-memory-warning LombaX 솔루션을 참조하십시오. 도움이 될 수도 있습니다. – NeverBe

답변

1

media에 대해 NSManagedObject의 새 인스턴스를 할당합니다. 대신 media의 인스턴스를 하나 정의하고이를 다시 사용할 수 있습니다.

또한 실제로는 NSFetchedResultsController을 사용할 수 있다고 생각합니다.이 결과는 일련의 가져 오기 결과를 반복하는 데 최적화되어 있으며 모든 종류의 장면 메모리 최적화가 가능합니다.

당신은 단순히 이런 식으로 반복 할 수는 :

for (id object in _fetchedResultsController.fetchedObjects) 

나는이 두 가지 제안은 크게 메모리 풋 프린트를 감소한다고 생각합니다.

+0

NSFetchedResultsController를 사용하여 동일한 결과를 얻으려고 시도했습니다. NSFetchedResultsController와 관련하여 메모리를 증가 시키려고 시도 할 수있는 추가 기술은 무엇입니까? – Andrew