1

次の宣言があります。

 //.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");
    }

表示されたときにnull値を取得NSMutableArray(dataArray)します。どうすればこれを解決できますか?または、可能であればNSMutableDicitonary、テーブル ビュー セルにデータを表示する方法に関する知識を教えてください。

4

3 に答える 3

0

dreamlax が言及したリークを解決するには、この前にコードを追加する必要があります。

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 の例に取り組み、それらがどのようにデータをロードするかを確認する必要があります。

于 2010-01-13T05:55:58.607 に答える
0

あなたのコードには、いくつかの がありますalloc。これらとのバランスをとる必要がありますreleasecopyとバランスを取る必要がある もあります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てくださいcopycopyオブジェクトの不変のコピーを作成するので便利です。ただし、コピーを作成した場合は、コピーの所有者であり、それをリリースする責任があります。でアレイを追加すると、アレイはそのコピーdataArrayの所有権を取得しますが、アレイを解放して所有権を放棄する必要があります。ただし、配列に渡す前にそれを行うことはできません。そうしないと、コピーが に渡される前に割り当てが解除されるため、代わりに自動解放されます。自動解放されたオブジェクトは、少なくともメソッドの残りの部分で存続することが保証されています。itemaddObject:releaseitemdataArray

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];
    }
于 2010-01-13T06:08:33.607 に答える
0

が作成されていることを確認する必要がありますdataArray。これをクラスのinitメソッドまたはその他の適切な場所に配置します。

dataArray = [[NSMutableArray alloc] init];

また、コードがかなりリークしているので、iPhone に多くのメモリがあることを願っています。

于 2010-01-13T05:38:08.350 に答える