繁体   English   中英

目标C静态方法每次都返回相同的值

[英]Objective c static method returns the same value every time

我正在为iPhone应用程序编写自定义XML反序列化器。 如下所示,我遍历了xml中的所有列表元素,并对其进行了调试,并且在每个循环中都有一个新的不同元素。 问题在于,xpath辅助方法(与下面发布的方法类似,但对于int和decimal)始终返回相同的值。

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

我是iphone /目标c /内存管理的新手,因此可以是许多东西。 我只是无法确定问题是什么:(有人可以提供帮助吗?

-(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>

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

参见http://www.w3schools.com/xpath/

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

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

另外,正如我在评论中提到的那样,您不应在助手方法中释放singleValueerrorresult 您不拥有这些东西,并且对他们的记忆不负责任 另一方面,由于使用alloc创建list ,因此您确实需要在每个循环结束时将其释放。 您当前正在每遍传递一个Listing对象。

我看来还可以。 尽管没有必要在getString:fromXPath:内部释放(您无需释放输入方法或从NSArray获得的对象中输入的参数。从NSArray中释放对象的正确方法是将其从数组中删除,至于作为参数传递的对象,如果要释放它,则应在调用该方法后执行。

您所提出的问题必须在其他地方。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM