У меня есть объект 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 и получил бы nil. Это было бы ошибкой для моего приложения. Экземпляр Root всегда должен иметь ненулевое значение для foo и bar; foo создается всякий раз, когда загружается экземпляр, а bar устанавливается вызывающей стороной сразу после получения корневого экземпляра.
Могу ли я полагаться на то, что didTurnIntoFault не вызывается, если мой код сохраняет NSManagedObject?
Если я не хочу, чтобы вызывалась didTurnInfoFault, зачем она мне? Ну, мне нужно как-нибудь почиститься. Может быть, мне действительно следует поместить этот код в Dealloc, если я не хочу, чтобы эти переменные экземпляра были освобождены, пока программа не завершит работу. Но я думаю, что я читал некоторую документацию, в которой не рекомендуется использовать Dealloc для подклассов NSManagedObject.