Objective c静态方法每次都返回相同的值

时间:2011-06-27 18:17:08

标签: iphone objective-c cocoa-touch

我正在为iphone应用编写自定义xml反序列化器。正如您在下面看到的,我循环遍历xml中的所有列表元素,我已经调试过它,并且每个循环都有一个新的不同元素。问题是xpath帮助器方法(与下面发布的方法类似,但对于int和decimal)总是返回相同的值。

例如 - 第一个循环的xml“SomeValue”值将为“abc”,辅助方法将返回“abc”,第二个项目出现并且其xml“SomeValue”为“XYZ”,但辅助方法仍将返回“ABC”。

我是iphone / objective c / memory管理的新手,所以它可以是任何数量的东西。我只是无法确定问题所在:(有人可以提供一些帮助吗?

-(void) deserializeAndCallback:(GDataXMLElement *)response
{
    NSError * error;

    NSArray *listings = [response nodesForXPath:@"//ListingSummary" error:&error];

    NSMutableArray *deserializedListings = [[NSMutableArray alloc] init];

    //loop through all listing elements, create a new listing object, set its values, and add
    //it to the list of deserialized objects.
    if(listings.count > 0)
    {

        for (GDataXMLElement *listingElement in listings) 
        {
            Listing *list = [[Listing alloc] init];

            //xpath helper function (shown below), just to get the value out of the xml
            list.someValue = [QuickQuery getString:listingElement fromXPath:@"//SomeValue"];

            [deserializedListings addObject:list];

        }
    }

    if([super.delegate respondsToSelector: @selector(dataReady:)]) 
    {
        [super.delegate dataReady:deserializedListings];
    } 
}


+(NSString *) getString:(GDataXMLElement *)element fromXPath:(NSString *)xPath
{
    NSError *error;
    NSArray *result = [element nodesForXPath:xPath error:&error];

    if(result.count > 0)
    {
        GDataXMLElement *singleValue = (GDataXMLElement *) [result objectAtIndex:0];
        return singleValue.stringValue;
        [singleValue release];
    }
    return nil;
    [error release];
    [result release];

}
编辑:好的......我发现了更多信息。在辅助函数内部,nodesForXpath方法返回整个xml中的所有节点,而不仅仅是我忙于处理的当前元素。 GDataXMLElement是否始终引用其父元素?

xml的样子

<ListingSummary>
    <SomeValue>abc</SomeValue>
</ListingSummary>
<ListingSummary>
    <SomeValue>jhi</SomeValue>
</ListingSummary>
<ListingSummary>
    <SomeValue>xyz</SomeValue>
</ListingSummary>

4 个答案:

答案 0 :(得分:2)

您所看到的是您正在使用的XPath查询的正确行为。实际上,您需要查询相对于当前节点的查询,而不是您正在执行的文档根目录。

请参阅http://www.w3schools.com/xpath/

BTW + (NSString *)getString:(GDataXMLElement *)element fromXPath:(NSString *)xPath是一种类方法,而不是静态方法。

答案 1 :(得分:1)

你说nodesForXPath:返回整个文档中的所有节点。由于您使用相同的参数@"//SomeValue",每个循环调用该方法,因此每次都会返回相同的数组。这意味着[result objectAtIndex:0]每次都会为您提供相同的对象。

另外,正如我在评论中提到的,您不应该在帮助方法中发布singleValueerrorresult。你不拥有这些,而你不是responsible for their memory。另一方面,由于您使用list创建alloc,因此执行需要在每个循环结束时释放它;你目前正在每次传递一个Listing对象。

答案 2 :(得分:0)

对我来说看起来不错。虽然getString:fromXPath:中的发布是不必要的(你不需要释放输入到方法中的参数或从NSArray获得的对象。从NSArray中释放对象的正确方法是将其从数组中删除,对于作为参数传递的对象,如果要释放它,则应在调用方法后执行此操作。

问题的问题必须在其他地方。

答案 3 :(得分:-2)

result.count应为[result count],因为count是一种方法,而不是NSArray的属性