[英]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]
每次都给您相同的对象。
另外,正如我在评论中提到的那样,您不应在助手方法中释放singleValue
, error
或result
。 您不拥有这些东西,并且对他们的记忆不负责任 。 另一方面,由于使用alloc
创建list
,因此您确实需要在每个循环结束时将其释放。 您当前正在每遍传递一个Listing
对象。
我看来还可以。 尽管没有必要在getString:fromXPath:内部释放(您无需释放输入方法或从NSArray获得的对象中输入的参数。从NSArray中释放对象的正确方法是将其从数组中删除,至于作为参数传递的对象,如果要释放它,则应在调用该方法后执行。
您所提出的问题必须在其他地方。
result.count
应该是[result count]
因为count是NSArray
的方法而不是属性
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.