我想为从NSManagedObject派生的类添加额外的行为,并且有4个不同的(现在)行为组。我不需要使用CoreData持久化我的装饰器类 - 它纯粹是为了添加运行时行为。
但是,如果我尝试应用标准的Decorator模式,我就不能调用'[super init]',这是有道理的,因为你需要将新对象插入到ManageObjectContext中。但我认为你想在WindowClassScrollDecorator的init中调用[super init],同样,稍后'dealloc'所以一切都被初始化&正确清理。
我继承自'MyWindowClass'类,因为我不希望我的客户端类知道子类型,但根据所使用的装饰器,行为会有所不同。
那么有什么方法可以解决这个问题呢?
@interface MyWindowClass : NSManagedObject
{
}
@end
@interface WindowClassScrollDecorator: MyWindowClass
{
MyWindowClass *decoratedClass;
}
- (id)initWithMyWindowClass:(MyWindowClass *)aWindowClass;
@end
@implementation WindowClassScrollDecorator
- (id)initWithMyWindowClass:(MyWindowClass *)aWindowClass
{
// Calling [super init] elicits the following error:
// Failed to call designated initializer on NSManagedObject class 'ModelClassScrollDecorator'
if (self = [super init])
{
// do some initialization work here
self.decoratedClass = aWindowClass;
}
}
@end
答案 0 :(得分:1)
NSManagedObject
的生命周期与其他对象的生命周期略有不同;具体而言,对象可能会变成一个错误(本质上是一个没有设置任何属性的shell对象)而不会被释放。您应该确保了解这些事件,因此您可能需要查看NSManagedObject Class Reference - Subclassing Notes文档。具体来说,您可能需要查看awakeFromInsert:
,awakeFromFetch:
和(will|did)TurnIntoFault
。
要解决您的直接问题,在没有NSManagedObject
的情况下无法创建NSManagedObjectContext
。因此,要初始化托管对象,您必须调用其指定的初始化程序:
initWithEntity:insertIntoManagedObjectContext:
您的init方法需要在超类上调用该方法,否则您的NSManagedObject
将无效。
答案 1 :(得分:0)
你在这里的问题似乎不是CoreData特定的,而是OO设计。
如果NSManagedObject不是NSManagedObject,则不应该继承NSManagedObject。
您应该使MyWindowClass成为协议或具有NSManagedObject的类。