gpt4 book ai didi

iphone - 将装饰器添加到从 NSManagedObject 派生的类中

转载 作者:行者123 更新时间:2023-12-03 21:24:38 24 4
gpt4 key购买 nike

我想向从 NSManagedObject 派生的类添加额外的行为,并且有 4 个不同的(目前)行为组。我不需要我的装饰器类与 CoreData 一起保存——它纯粹是为了添加运行时行为。

但是,如果我尝试应用标准装饰器模式,则无法调用“[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

最佳答案

NSManagedObject的生​​命周期与其他对象有点不同;具体来说,该对象可能会在不被释放的情况下变成错误(本质上是一个没有设置任何属性的 shell 对象)。您应该确保了解这些事件,因此您可能需要查看 NSManagedObject Class Reference - Subclassing Notes文档。具体来说,您可能需要查看 awakeFromInsert:awakeFromFetch:(will|did)TurnIntoFault

为了解决您眼前的问题,如果没有 NSManagedObjectContext 驻留在其中,则无法创建 NSManagedObject。因此,要初始化托管对象,您必须调用其指定的初始值设定项:

initWithEntity:insertIntoManagedObjectContext:

您的 init 方法需要调用父类(super class)上的该方法,否则您的 NSManagedObject 将无法工作。

关于iphone - 将装饰器添加到从 NSManagedObject 派生的类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1474940/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com