未能调用NSManagedObject类'建设'上的指定初始值设定项

问题描述:

我目前正在创建我的NSXMLParser,我将委托传递给相关对象。未能调用NSManagedObject类'建设'上的指定初始值设定项

当我的解析器到达名称为“building”的元素时,它将使用此代码初始化一个新的Building。

if ([elementName isEqualToString:@"building"]) 
{ 
    building = [[Building alloc] initWithAttributes:attributeDict parent:self children:nil parser:parser]; 
} 

我已经创造了建筑类我自己的初始化,这是NSManagedObject的子类。(从核心数据自动生成)。

它看起来像这样:

- (id)initWithParser:(NSXMLParser *)parser 
{ 
    if (self = [super init]) 
    { 
     [parser setDelegate:self]; 
    } 
    return self; 
} 

但是当我运行它,我得到这个错误:“未能呼吁NSManagedObject类指定初始化”。

Building类应继续解析构建下的标记并从XML文件中创建对象图。

换句话说,建筑类需要知道如何解析,填充实例变量,创建实体,并将其保存到对象图。(只是为了理解,这可以忽略不计)

我做有问题?我可能不会创建我自己的初始化程序?也许我应该创建一个继承自NSObject的类并创建我的解析器,然后从那里以正常的方式创建实体?

对不起,这篇文章很长。

看看NSManagedObjects的documentation for the object life-cycle及其子类。生命周期与普通的NSObject类型对象不同,如果您要使用Core Data,则需要理解它。

NSManagedObjects的指定初始化程序是initWithEntity:insertIntoManagedObjectContext:,因此您实现的任何自定义初始化程序必须首先调用此方法。 但是,正如它在文档中所说,你不鼓励覆盖这种方法。

而是,在awakeFromInsertawakeFromFetch中进行自定义初始化。要创建NSManagedObject的新实例,请调用initWithEntity:insertIntoManagedObjectContext:或使用便捷方法+[NSEntityDescription insertNewObjectForEntityForName:inManagedObjectContext:]

+0

谢谢,我想我现在明白了。 – WYS

+0

哦,是的,这意味着我的方法是没有错的?这是可能的吗? :) – WYS

+0

我不确定你是如何组织你的代码,但它看起来像你试图将解析过紧到NSManagedObjects。如果我是你,我会创建一个单独的NSObject派生NSXMLParser委托,在一个地方管理NSManagedObjects的创建和配置。将NSManagedObjects设置为解析器委托并在许多对象之间分配解析听起来过于复杂且容易出错。 –