所以基本上我每次从Web请求收到有效响应时都尝试创建类的实例,然后将这些实例存储在一个数组中,以便以后可以访问它们的数据。然后,我尝试使用存储在数组中的实例的特定字段填充表视图。我一直有一些问题,因为我非常熟悉C ++并且使用向量做这种事情,然后根据我需要的索引进行访问,但是这让我脱掉了头发!谢谢,代码如下:
eventDetails.h:
@interface eventDetails : NSObject {
NSString *eventName, *eventID;
}
-(void) setEventID : (NSString *) ID;
-(void) setEventName: (NSString *) name;
-(NSString *) getEventName;
-(NSString *) getEventID;
并注意到
NSMutableArray *events
在我的.h文件和
中声明 events = [[NSMutableArray alloc] init];
已在viewDidLoad
中调用然后我动态创建实例,因为从Web请求收到响应并将它们添加到数组中:
if ([elementName isEqualToString:@"id"])
{
NSLog(@"at beginning of event, length is %i", [events count]);
temp = [[eventDetails alloc] init];
[temp setEventID:[NSMutableString stringWithString:soapResults]];
[soapResults setString:@""];
elementFound = FALSE;
}
if ([elementName isEqualToString:@"name"])
{
[temp setEventName:[NSMutableString stringWithString:soapResults]];
[events addObject:temp];
[soapResults setString:@""];
elementFound = FALSE;
//[temp release];
}
完成所有操作后,我创建了一个小测试功能,以确保数据设置正确:
-(void) test{
for (eventDetails *s in events){
NSLog(@"Entry ID: %@ with name %@", [s getEventID], [s getEventName]);
}
}
我得到以下(正确的)输出:
2011-04-09 18:53:24.624 Validator [90982:207]条目ID:701,名称为iPhone Test Event 2011-04-09 18:53:24.625 Validator [90982:207]条目ID:784与名称另一个iPhone测试事件 2011-04-09 18:53:24.626 Validator [90982:207]条目号:839,名称为第三个iphone
然后我尝试刷新表视图,并从数组中的实例中提取数据:
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
//---try to get a reusable cell---
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
//---create new cell if no reusable cell is available---
if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier] autorelease];
}
//---set the text to display for the cell---
eventDetails *cellDetails = [[eventDetails alloc] init];
NSInteger row = [indexPath row];
cellDetails = [[self events] objectAtIndex:row];
NSString *cellValue = [cellDetails getEventName];
NSLog(@"Event is: %@", cellValue);
cell.textLabel.text = cellValue;
cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
return cell;
}
但是每次程序到达这个部分时,它崩溃了我说的EXC_BAD_ACCESS:
cell.textLabel.text = cellValue;
感谢您的帮助。我想我可能在如何声明eventDetails类的实例时做错了,但是我不确定它是否正确存储那些数据。如果您需要更多代码,我会缺少部分。
答案 0 :(得分:0)
您发布的代码中有太多遗漏的详细信息,但我的猜测是eventName
未被保留,并且在您尝试使用之前的某个时间被释放。
检查您的setEventName:
实施情况;它需要将retain
或copy
发送到name
参数,以确保在您使用它之前不会释放该字符串。但是,如果你想避免内存泄漏,情况要比这更复杂,所以如果你还没有这样做,我建议你阅读内存管理,特别是Apple优秀的内存管理编程指南。 (注意:由于Apple不断更改链接,我已经放弃了发布链接。)
附注:请勿使用单词get
为访问者方法的名称添加前缀;这在Java或C ++中会很好,但这是Objective-C。您的访问者应如下所示:
- (NSString *)eventName;
- (NSString *)eventID;
无法保证依赖内省的Foundation机制能够正确处理不符合文档命名约定的访问器,因此这是另一回事。 : - )