У меня есть некоторые функции Core Data, которые работали нормально до тех пор, пока не были внесены некоторые недавние (казалось бы, не связанные) изменения. Теперь у меня возникают проблемы, когда все атрибуты, принадлежащие конкретному экземпляру подкласса NSManagedObject, внезапно возвращают nil.
Допустим, мой подкласс NSManagedObject называется Foo, и у него есть только один атрибут с именем value. Как только я понял, что значение каким-то образом становится равным нулю, я пошел и установил следующую категорию для отслеживания изменений в значении.
@implementation Foo (Debug)
- (void)setValue:(NSDate *)value
{
[self willChangeValueForKey:@"value"];
[self setPrimitiveValue:value forKey:@"value"];
[self didChangeValueForKey:@"value"];
}
- (NSDate *)value
{
[self willAccessValueForKey:@"value"];
NSDate *value = [self primitiveValueForKey:@"value"];
[self didAccessValueForKey:@"value"];
return value;
}
@end
setValue: вызывается для моего объекта, а переданный аргумент не равен нулю NSDate. Затем значение извлекается (другим методом). То же значение, которое было указано, извлекается правильно.
Однако, когда другой метод пытается прочитать значение, вызывается метод доступа к значению, и primitiveValueForKey: возвращает нулевое значение.
Между двумя считываниями setValue: не вызывается и сам объект Foo по-прежнему действителен (не равен нулю). Фактически никакие другие операции Core Data не выполняются между двумя чтениями любого объекта Core Data или контекста в целом.
Мы используем ARC в нашем проекте. Возможно ли, что ARC каким-то образом вмешивается в мои переменные Core Data и освобождает их? Если да, есть ли у кого-нибудь предложения по отладке освобождений ARC? Или еще лучше, знает ли кто-нибудь способ гарантировать, что ARC не освобождает мою переменную.
Это может даже не иметь отношения к ARC, однако я немного не понимаю, что происходит. Будем очень признательны за любые предложения.