У меня есть объект Core Data, который использует пользовательский подкласс NSManagedObject. У меня есть несколько переменных экземпляра и свойств, которые не связаны с атрибутами или связями Core Data. Пример того, что я делаю, это:
@interface Root : NSManagedObject
{
Foo *foo;
Bar *bar;
}
@property (nonatomic, retain) Foo *foo;
@property (nonatomic, retain) Bar *bar;
// Core Data generated
@property (nonatomic, retain) Node *relationship;
@property (nonatomic, retain) NSString *attribute;
-(void)awake;
@end
@implementation Root
@synthesize foo;
@synthesize bar;
@dynamic relationship;
@dynamic attribute;
-(void)awakeFromInsert {
[super awakeFromInsert];
[self awake];
}
-(void)awakeFromFetch {
[super awakeFromFetch];
[self awake];
}
-(void)awake {
Foo *newFoo = [[Foo alloc] init];
self.foo = newFoo;
[newFoo release];
// bar is not automatically initialized, but can be set by something external
}
-(void)didTurnIntoFault {
[foo release];
foo = nil;
[bar release];
bar = nil;
[super didTurnIntoFault];
}
@end
Теперь в моем приложении один экземпляр Root по запросу извлекается один раз при запуске приложения, и я сохраняю его до тех пор, пока приложение не закроется. (На самом деле это немного сложнее, потому что вы можете удалить корневой экземпляр и создать новый, но не более одного существует одновременно и сохраняется.) Поэтому я надеюсь, что didTurnIntoFault никогда не будет вызываться, пока мое приложение не закроется. Если это произойдет, то в какой-то момент я обращусь к root.foo или root.bar и получу ноль. Это было бы ошибкой для моего приложения. Экземпляр Root всегда должен иметь ненулевое значение для foo и bar; foo создается всякий раз, когда загружается экземпляр, и вызывающая сторона устанавливает панель сразу после извлечения корневого экземпляра.
Могу ли я рассчитывать на то, что didTurnIntoFault не вызывается, если мой код сохраняет NSManagedObject?
Если я не хочу вызывать didTurnInfoFault, почему он у меня? Ну, мне нужно как-нибудь убраться. Возможно, мне действительно следует поместить этот код в dealloc, если я не хочу, чтобы эти переменные экземпляра были освобождены до тех пор, пока программа не закроется. Но я думаю, что прочитал некоторую документацию, которая не рекомендуется использовать dealloc для подклассов NSManagedObject.