NSMutableArray&从中检索对象,从NSXMLParser填充

时间:2011-01-17 13:28:52

标签: iphone objective-c nsmutablearray nsxmlparser

我是Objective-C& amp;的新手iPhone开发,请耐心等待。

我正在开发一个使用UITableView加载的应用程序,在选择一个名为“Address Book”的特定单元格时,它应该加载另一个UITableView,其中包含从Web请求中检索到的所有地址。使用NSXMLParser的委托方法我将这些地址存储到加载的视图头文件中定义的NSMutableArray中。但是当这些地址显示在UITableView单元格上时会出现问题(是的,我已计算出单元格的数量)。任何人都可以帮我解决这个问题吗?我已经坚持了几天了!!!以下是我的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}

AddressEntry *entry = (AddressEntry *)[self.addresses objectAtIndex:indexPath.row];

@try
{
    NSLog(@"%@", entry.firstName);
}
@catch (NSException * e) 
{
    @try 
    {
        NSLog(@"%@", entry.lastName);
    }
    @catch (NSException * e) 
    {
        NSLog(@"%@", entry.lastName);
    }
}
[entry release];

return cell;
}

    - (void)parserDidStartDocument:(NSXMLParser *)parser
{
    self.currentElement = nil;
    self.f_Name = nil;
    self.l_Name = nil;
    self.phone = nil;
    self.email = nil;
    count = 0;
    self.addresses = [[NSMutableArray alloc] init];
}

- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
                                     namespaceURI:(NSString *)namespaceURI 
                                    qualifiedName:(NSString *)qName 
                                       attributes:(NSDictionary *)attributeDict
{


if([elementName isEqualToString:@"Entries"])
    {
        count = [[attributeDict valueForKey:@"total"] intValue];
    }
    else if([elementName isEqualToString:@"FirstName"])
    {       
        [self.f_Name release];
        self.f_Name = [[NSString alloc] init];
    }
    else if([elementName isEqualToString:@"LastName"])
    {
        [self.l_Name release];
        self.l_Name = [[NSString alloc] init];
    }
    else if([elementName isEqualToString:@"PhoneNumber"])
    {
        [self.phone release];
        self.phone = [[NSString alloc] init];
    }
    else if([elementName isEqualToString:@"EmailAddress"])
    {
        [self.email release];
        self.email = [[NSString alloc] init];
    }
    else if([elementName isEqualToString:@"Record"])
    {
        [self.addrEntry release];
        self.addrEntry = [[[AddressEntry alloc] init] retain];
    }

[self.currentElement release];
self.currentElement = nil;
self.currentElement = [elementName copy];
}


- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
                                       namespaceURI:(NSString *)namespaceURI 
                                      qualifiedName:(NSString *)qName
{
    //
    if([elementName isEqualToString:@"FirstName"])
        self.addrEntry.firstName = self.f_Name;
    else if ([elementName isEqualToString:@"LastName"])
        self.addrEntry.lastName = self.l_Name;
    else if([elementName isEqualToString:@"PhoneNumber"])
        self.addrEntry.mobile = self.phone;
    else if([elementName isEqualToString:@"EmailAddress"])
        self.addrEntry.emailAddress = self.email;
    else if([elementName isEqualToString:@"Record"])
    {
        [self.addresses addObject:self.addrEntry];
        [self.addrEntry release];
        self.addrEntry = nil;
        /*AddressEntry *e = (AddressEntry *)[self.addresses lastObject];
        NSLog(@"%@ %@ %@ %@", e.firstName, e.lastName, e.mobile, e.emailAddress);
        [e release];*/
    }
}


- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    if([currentElement isEqualToString:@"FirstName"])
        self.f_Name = string;
    else if([currentElement isEqualToString:@"LastName"])
        self.l_Name = string;
    else if([currentElement isEqualToString:@"PhoneNumber"])
        self.phone = string;
    else if([currentElement isEqualToString:@"EmailAddress"]) 
    {
        self.email = string;
    }

}

1 个答案:

答案 0 :(得分:0)

应用程序崩溃的最可能原因是cellForRowAtIndexPath中的这一行:

[entry release];

您没有alloc / init变量entry,因此请勿在其上调用release。删除该行。

在该方法中,entry仅保存对地址数组中已分配对象的引用。它不“拥有”该对象,因此不应该释放它。

This page in the Apple docs显示了一个很好的流程图和一些简单的内存管理规则,可能有助于更好地理解这一点。


作为与崩溃无关的单独问题,在您的示例中使用@try/@catch似乎是不必要的。有关说明,请参阅this answer


最后,与崩溃无关,在foundCharacters中,您应该将string参数附加到数据而不是仅仅分配,因为该方法可以在同一值内多次调用。有关示例,请参阅Handling XML Elements and Attributes