Материал NSMutableDicitonary в NSMutableArray - PullRequest
1 голос
/ 13 января 2010

У меня есть следующие объявления:

 //.h file:
    NSMutableArray *dataArray;
    NSMutableDictionary *item;

    //.m file
    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{            
        currentElement = [elementName copy];
        if ([elementName isEqualToString:@"table"]){
        item = [[NSMutableDictionary alloc] init];
        currentEid = [[NSMutableString alloc] init];
        currentEname = [[NSMutableString alloc] init];
        currentEurl = [[NSMutableString alloc] init];
        }
        //NSLog(@"didStartElement");
        }

    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{     

        if ([elementName isEqualToString:@"table"]) {
            // save values to an item, then store that item into the array...
            [item setObject:currentEname forKey:@"ename"];
            //NSLog(@"%@",item);
            [self.dataArray addObject:[item copy]];
            NSLog(@"%@",dataArray);
            }
    }

    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
        if ([currentElement isEqualToString:@"eid"]) {
            [currentEid appendString:string];
        } else if ([currentElement isEqualToString:@"ename"]) {
            [currentEname appendString:string];
            //NSLog(@"%@",currentEname);
        } else if ([currentElement isEqualToString:@"eurl"]) {
            [currentEurl appendString:string];
        } 
        //  NSLog(@"foundCharacters");
    }

Я получаю нулевые значения для NSMutableArray(dataArray) при отображении. Как я мог решить это? Или, если вы можете, помогите мне узнать, как отображать данные NSMutableDicitonary в ячейках табличного представления.

Ответы [ 3 ]

0 голосов
/ 13 января 2010

Чтобы устранить утечку мечты, упомянутую выше, вам необходимо добавить код перед этим:

item = [[NSMutableDictionary alloc] init];
        currentEid = [[NSMutableString alloc] init];
        currentEname = [[NSMutableString alloc] init];
        currentEurl = [[NSMutableString alloc] init];

Что-то вроде этого:

[item release]; [currentEid release]; [currentEname release]; [currentEurl release];
item = [[NSMutableDictionary alloc] init];
            currentEid = [[NSMutableString alloc] init];
            currentEname = [[NSMutableString alloc] init];
            currentEurl = [[NSMutableString alloc] init];

А также перезапустите их, когда закончите анализ ...

Не проверяйте мой ответ как правильный, однако, dreamlax заслуживает похвалы за обдумывание кода ...

Для заполнения UITableView вам действительно нужно разобраться с некоторыми примерами UITableView и посмотреть, как они загружают данные.

0 голосов
/ 13 января 2010

В вашем коде у вас есть число alloc с. Они должны быть сбалансированы с release. У вас также есть copy, который должен быть сбалансирован с release. Если вы не отпустите эти объекты, вы будете снова и снова выделять новые объекты, и в конечном итоге вам не хватит памяти.

Что вам нужно сделать, так это выяснить, где в вашем коде находится подходящее место для их выпуска. Когда вам больше не нужны объекты, которые вы выделили, вы должны освободить их. В вашем случае было бы разумно добавить следующий код в ваш метод - (void)parser:didEndElement:namespaceURI:qualifiedName:, например:


- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{     
        if ([elementName isEqualToString:@"table"]) {
            // save values to an item, then store that item into the array...
            [item setObject:currentEname forKey:@"ename"];
            //NSLog(@"%@",item);
            [self.dataArray addObject:[[item copy] autorelease]];
            NSLog(@"%@",dataArray);
            }
        [currentEid release];
        [currentEname release];
        [currentEurl release];
    }

Обратите внимание, что я также добавил autorelease к вашему copy. copy полезно, потому что он создает неизменную копию вашего объекта, что в данном конкретном случае может быть тем, что вам нужно. Однако, когда вы создаете копию, вы являетесь ее владельцем и несете ответственность за ее публикацию. Ваш массив dataArray станет владельцем вашей копии item, когда вы добавите ее с помощью addObject:, но вы все равно должны отказаться от своей собственности, выпустив ее. Однако мы не можем release это сделать до того, как передадим его в массив, в противном случае копия item будет освобождена до того, как будет передана dataArray, поэтому вместо этого она автоматически освобождается. Автосвобожденный объект гарантированно выживет, по крайней мере, до конца метода.

Альтернативой автоматическому высвобождению является ручное отслеживание копии item, например:


- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{     
        if ([elementName isEqualToString:@"table"]) {
            NSDictionary *itemCopy;
            // save values to an item, then store that item into the array...
            [item setObject:currentEname forKey:@"ename"];
            //NSLog(@"%@",item);
            itemCopy = [item copy];
            [self.dataArray addObject:itemCopy];
            [itemCopy release];
            NSLog(@"%@",dataArray);
            }
        [currentEid release];
        [currentEname release];
        [currentEurl release];
    }
0 голосов
/ 13 января 2010

Вы должны убедиться, что dataArray создано. Поместите это в init метод вашего класса или где-то еще, где это будет уместно:

dataArray = [[NSMutableArray alloc] init];

Кроме того, я надеюсь, что ваш iPhone имеет много памяти, так как ваш код протекает довольно много.

...