2011-05-18 40 views
1

打開下面這段代碼工作得很好,如果在項目屬性中選擇垃圾收集沒有打開。但隨着GC打開,這是錯誤消息:XML元素插入錯誤的

*斷言失敗 - [NSXMLFidelityElement insertChild:atIndex:],/SourceCache/Foundation/Foundation-751.53/XML.subproj/XMLTypes.subproj/NSXMLElement .M:823" ‘不能添加具有父項的子;分離或複製第一’

什麼建議嗎?

-(void)insertXmlRecord 
{ 
    //xmlDoc is an iVar 
    NSXMLElement *nodeToAdd = [[NSXMLElement alloc] initWithXMLString:[self readOnScreenSetAttrib] error:nil]; 
    NSError *err=nil; 
    NSXMLElement *thisName; 
    NSArray *nodes = [xmlDoc nodesForXPath:@"./dream" error:&err]; 
    NSLog(@"insertXMLRecord xmldoc %@", xmlDoc);  
    if ([nodes count] > 0) 
    { 
     thisName = [nodes objectAtIndex:0]; 
     NSLog(@"insertXMLRecord: thisname: %@", thisName); 
     NSLog(@"insertXMLRecord: nodeToAdd: %@", nodeToAdd); 
     [thisName addChild:nodeToAdd]; 
    } 
    //NSLog(@"insertXMLRecord"); 
} 

回答

4

你會看到,因爲使用GC,父節點被視爲「仍在使用中」,因此仍然附着到其子節點。你必須將它添加到thisName之後的子節點複製:

[thisName addChild:[nodeToAdd copy]]; 
+0

就是這樣。仍然需要了解更多關於內存管理的知識! – user523234 2011-05-18 16:59:29

+0

這看起來像一個錯誤。如果沒有GC'nodeToAdd'沒有父,與GC它有一個...使用'copy'只是規避錯誤。所以,除非我在這裏是完全關閉基地,我建議你的文件與蘋果的bug報告。 – CRD 2011-05-18 19:30:26

+0

我懷疑我們真的沒有完整的代碼 - 如果父節點被釋放但節點被保留,它可能會將其子節點的父節點設置爲'nil',但由於引用不是'__weak',它在GC環境中不會這樣做。 – 2011-05-18 20:07:04

0

它爲我工作感謝喬納森Grynspan

NSDecimalNumber *time = message.time; 
    NSXMLElement *timex = [[NSXMLElement alloc] initWithName:@"timex"]; 
    [timex setStringValue:time.stringValue]; 
    [timex addChild:[timex copy]]; 
    [timex addChild:timex]; 

ATT。卡洛斯·拉米雷斯