У вас есть несколько ошибок в коде, и я попытался объяснить, что происходит в списке рассылки RestKit.Позвольте мне вставить здесь ответ (с некоторыми исправлениями, чтобы текст был легче понять).
Естественно, что контекст управляемого объекта даже не знает о свойстве, которое не определено в моделии ни один не является постоянным хранилищем объектов.Следовательно, должно быть что-то еще.
Давайте посмотрим на ваш код.Вы ударили в promotion = nil;
- что не освобождает объект.В этой части кода у вас нет утечки, но объект не освобождается на этом этапе.Этот объект удерживается в массиве resultArray.
Итак, когда объект освобождается?Он будет выпущен вместе с resultArray
.Вы не освобождаете resultArray
, выделенное вами в +promotionWithId:inManagedObjectContext:
. Вы вообще не освобождаете его. Похоже, нет никаких оснований для преобразования массива результатов в изменяемый массив.
Два варианта решения:
NSArray *resultArray = [context executeFetchRequest:fetchReq error:nil];
или
NSMutableArray *resultArray = [[NSMutableArray alloc] initWithArray:[context executeFetchRequest:fetchReq error:nil]];
[resultArray autorelease];
Оба объекта являются автоматически выпущенными.Если вы пойдете по маршруту автоматического выпуска, объект будет освобожден, как только будет удален или освобожден ближайший пул автоматического выпуска.Вы можете добавить свой пул автоматического выпуска, обернув код в: NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];и [пул релиз];
Без этого ближайший пул автоматического выпуска, вероятно, находится в главном цикле выполнения Какао.Таким образом, resultArray
(и, следовательно, ваш результирующий объект) будет освобожден в главном цикле выполнения Cocoa.
Возможно, вы захотите выпустить resultArray
непосредственно внутри +promotionWithId:inManagedObjectContext:
, но не перед сохранением и автоматическим выпуском[resultArray objectAtIndex:0];
Итак, что должно произойти, когда вы отпустите объект?Надеемся, что он должен быть удален из контекста управляемого объекта, и любая извлеченная копия должна быть ошибкой (поскольку исходная копия исчезла или должна исчезнуть).Честно говоря, я поражен тем, что в первую очередь возвращается одна и та же копия объекта (и спасибо, что задали этот вопрос) - но это логично, поскольку Core Data - это просто диспетчер графов объектов, который, удобно, поставляется свысокопроизводительный персистентный слой.
Вы также можете вручную превратить объект в неисправность: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdFaultingUniquing.html
Надеюсь, это поможет!