Objective c статический метод каждый раз возвращает одно и то же значение - PullRequest
1 голос
/ 27 июня 2011

Я пишу пользовательский десериализатор xml для приложения iphone.Как вы можете видеть ниже, я перебираю все элементы списка в xml, отлаживаю его, и с каждым циклом появляется новый и новый элемент.Проблема в том, что вспомогательные методы xpath (есть методы, аналогичные приведенным ниже, но для int и decimal) всегда возвращают одно и то же значение.

Например - значение xml «SomeValue» 1-го цикла будет «abc», а вспомогательный метод вернет «abc», второй элемент появится, а его «SomeValue» xml - «XYZ», но вспомогательный методбудет по-прежнему возвращать «abc».

Я новичок в управлении iphone / target 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];

}

РЕДАКТИРОВАТЬ: хорошо ... Я нашел немного больше информации. Внутри вспомогательной функции, nodeForXpath метод возвращает всеузлы всего xml, а не только текущий элемент, с которым я занят. GDataXMLElement вообще хранит ссылку на свои родительские элементы?

Пример того, как xml выглядит

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

Ответы [ 4 ]

2 голосов
/ 28 июня 2011

То, что вы видите, - это правильное поведение для запроса XPath, который вы используете.Вы на самом деле хотите запрос относительно текущего узла, а не корня документа, как вы делаете.

См. http://www.w3schools.com/xpath/

Кстати + (NSString *)getString:(GDataXMLElement *)element fromXPath:(NSString *)xPath - это метод класса, а не статический метод.

1 голос
/ 27 июня 2011

Вы говорите, что nodesForXPath: возвращает все узлы из всего документа.Поскольку вы вызываете этот метод с одинаковым аргументом @"//SomeValue" в каждом цикле, вы каждый раз возвращаете один и тот же массив.Это означает, что [result objectAtIndex:0] каждый раз дает вам один и тот же объект.

Кроме того, как я упоминал в комментарии, вы не должны выпускать singleValue, error или result в вашем вспомогательном методе,Вы не владеете ими, и вы не несете ответственность за их память .С другой стороны, поскольку вы создаете list с использованием alloc, вам do необходимо освободить его в конце каждого цикла;в настоящее время вы пропускаете объект Listing каждый проход.

0 голосов
/ 27 июня 2011

Это выглядит нормально для меня.Хотя выпуски внутри getString: fromXPath: не нужны (вам не нужно выпускать параметры, введенные в метод или объекты, полученные из NSArray. Правильный способ освободить объект из NSArray - это удалить его из массива,Что касается объектов, переданных в качестве параметра, если вы хотите освободить его, вы должны сделать это после вызова метода.

Проблема вашего вопроса должна быть в другом месте.

0 голосов
/ 27 июня 2011

result.count должно быть [result count], поскольку count является методом, а не свойством NSArray

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...