Сохраняя объект, который был добавлен в свойство отношения NSManagedObject

Есть подкласс NSManagedObject:

    @interface ManagedActivityAmount : NSManagedObject

    @property (nonatomic, retain) NSNumber * distance;
    @property (nonatomic, retain) NSNumber * duration;
    @property (nonatomic, retain) NSSet *sets;

    @end

    @interface ManagedActivityAmount (CoreDataGeneratedAccessors)

    - (void)addSetsObject:(ManagedPowerSet *)value;
    - (void)removeSetsObject:(ManagedPowerSet *)value;
    - (void)addSets:(NSSet *)values;
    - (void)removeSets:(NSSet *)values;

    @end

Я сталкиваюсь с проблемой при сохранении ссылки на объект, который я добавил в отношение множеств с помощью:

    - (void)addSetsObject:(ManagedPowerSet *)value;

объект ManagedPowerSet был успешно добавлен в свойство наборов ManagedActivityAmount, и я предполагаю, что его счетчик сохранения равен 1 из-за этого (фактический объект был автоматически освобожден до этого, поэтому счетчик хранения был равен 0, прежде чем добавить его в набор). я прав? я что-то пропустил?

Я назначаю ManagedPowerObject другой переменной экземпляра контроллера представления (это частная переменная экземпляра, а не сохраняемое свойство), но я не могу получить к ней доступ позже. я должен сохранить это? Я просто собираюсь сделать это и проверить, но я действительно хочу понять, что это не было сохранено в первую очередь.

Спасибо:)

2 ответа

Решение

Так что я ничего не пропустил, предположения о сохранении счета были правильными, сохранение не требовалось, так как объект переживает контроллер, если бы это было свойство, которое он должен был быть назначен..

проблема была действительно глупой с моей стороны, я не выделил что-то еще, что делало вид, будто объект потерян, хотя на самом деле это не так.

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

Если вы не используете ARC, вы должны требовать владения (сохранения) всего, что вы намереваетесь использовать позднее. И отпустите его, когда вы закончите с ним (для ivars это, как правило, будет в реализации dealloc класса). Я предлагаю вам использовать свойства, чтобы сделать это, поскольку это обычно приводит к меньшему количеству кодирования. Это связано с тем, что вы должны всегда освобождать старые указатели перед назначением новых:

[_managedPowerObject release];
_managedPowerObject = [managedPO retain];

Это будет использоваться всякий раз, когда присваивается ivar (переменная экземпляра) напрямую. Или вы можете просто использовать свойство:

@property (nonatomic, retain) ManagedPowerObject *managedPowerObject;

Реализация свойства по умолчанию будет обрабатывать освобождение / сохранение для вас, и теперь вы можете просто использовать:

self.managedPowerObject = managedPO;

Я бы посоветовал прочитать рекомендации Apple по управлению памятью: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html#//apple_ref/doc/uid/10000011-SW1

Другие вопросы по тегам