Сохраняя объект, который был добавлен в свойство отношения 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