Атрибут базовых данных изменяется на ноль (связанный с ARC?) - PullRequest
9 голосов
/ 26 августа 2011

У меня есть некоторые функциональные возможности 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 возвращает значение nil:.

Между двумячитает setValue: не вызывается, и сам объект Foo все еще действителен (не ноль).На самом деле никакие другие операции с базовыми данными не выполняются между двумя операциями чтения любого объекта базовых данных или контекста в целом.

Мы используем ARC в нашем проекте.Возможно ли, что ARC каким-то образом связывается с моими переменными Core Data и освобождает их?Если да, есть ли у кого-нибудь предложения по отладке освобождения ARC?Или, что еще лучше, кто-нибудь знает, как ARC не освобождает мою переменную.

Возможно, это даже не связано с ARC, однако я немного растерялся относительно того, что происходит.Будем очень благодарны за любые предложения.

Ответы [ 3 ]

12 голосов
/ 28 декабря 2011

Это очень вероятно, потому что NSManagedObjectContext, к которому принадлежат эти объекты, исчезает.Когда у вас есть NSManagedObject экземпляров, но вы сами не держитесь за контекст, эти управляемые объекты начнут возвращать nil.

В ARC убедитесь, что вы храните контекст в strongпеременная, т. е. переменная экземпляра, которая не является weak или static глобальной.

Non-ARC, то есть код сохранения-выпуска, убедитесь, что вы сохраняете контекст.

1 голос
/ 25 июля 2018

Как уже упоминалось другими (это был и мой случай), убедитесь, что у вас нет reset контекста управляемого объекта, потому что если вы это сделаете, все сущности, сохраненные как свойства, будут иметь data: <fault>.

Если вы сделаете reset свой контекст управляемого объекта, вам также придется повторно выбрать саму сущность.

0 голосов
/ 01 ноября 2011

проверьте метод viewDidLoad

profile = [NSEntityDescription insertNewObjectForEntityForName:@"MyProfile" inManagedObjectContext:profileContext];

надеюсь, что это работает

...