2011-11-18 86 views
3

我目前正在創建我的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的類並創建我的解析器,然後從那裏以正常的方式創建實體?

對不起,這篇文章很長。

回答

10

看看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設置爲解析器委託並在許多對象之間分配解析聽起來過於複雜且容易出錯。 –

相關問題