开发者

xml element inserting error with Objective-C garbage collection turned on

The following piece of code worked fine if garbage collection开发者_StackOverflow社区 was not turned on in the project properties option. But with GC turned on, this is the error message:

"* Assertion failure in -[NSXMLFidelityElement insertChild:atIndex:], /SourceCache/Foundation/Foundation-751.53/XML.subproj/XMLTypes.subproj/NSXMLElement.m:823" "Cannot add a child that has a parent; detach or copy first"

Any suggestion?

 -(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");
}


You're seeing that because with GC on, the parent node is seen as "still in use" and so remains attached to its child node. You must copy the child node before adding it to thisName:

[thisName addChild:[nodeToAdd copy]];


it Works for me thanks Jonathan Grynspan

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

Att. Carlos Ramirez

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜