我是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;
}
}
答案 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。