Утечка CoreData при чтении свойства - PullRequest
2 голосов
/ 27 декабря 2010

У меня есть следующий код в цикле итерации по различным document объектам:

NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
NSData* data = [document primitiveValueForKey:@"data"];
[document.managedObjectContext refreshObject:document mergeChanges:NO];
[pool release];

Свойство data представляет собой большой двоичный объект (изображение размером 1 МБ). И поскольку я наблюдаю за памятью с помощью Allocation Instrument, использование памяти увеличивается. Я не могу найти источник утечки и способ ее устранения.

Спасибо!

Ответы [ 4 ]

0 голосов
/ 09 января 2011

Ваше наблюдение о том, что processPendingChanges, кажется, решает проблему, подсказывает мне, что при импорте UndoManager для вашего NSManagedObjectContext отслеживает все изменения, которые вы вносите в процессе массового импорта.

То, что делает processPendingChanges (насколько я понимаю), отправляет изменения, хранящиеся в managedObjectContext, в постоянное хранилище.

Попробуйте [[document managedObjectContext] setUndoManager:nil] (или создайте новый managedObjectContext для импорта и установите для его undoManager значение nil, если ваш document.managedObjectContext является «главным» managedObjectContext и вы не хотите отключать отмену регистрации.

0 голосов
/ 04 января 2011

Как насчет вызова [pool drain] вместо [pool release]?

0 голосов
/ 07 января 2011

Мне удалось решить проблему, выполнив: [document.managedObjectContext processPendingChanges] прямо перед сливом пула.Тем не менее, я не понимаю, какие ожидающие изменения будут там?Может ли кто-нибудь просветить меня об этом?

0 голосов
/ 27 декабря 2010

Что-то не так с вашим примером кода, вы имели в виду:

NSData *data = [document primitiveValueForKey:@"data"]; 

Так как данные в настоящее время не назначены в рамках вашего автоматического повторного пула, они также не высвобождаются вместе с вашим автоматическим повторным пулом

Почему вы используете primitiveValueForKey , а не динамический метод доступа?

Динамические методы доступа намного эффективнее и позволяют выполнять проверку во время компиляции.

...