Objective c 将UITableViewCell设置为自定义对象实例中的值

Objective c 将UITableViewCell设置为自定义对象实例中的值,objective-c,uitableview,Objective C,Uitableview,因此,基本上,每次我从web请求收到有效响应时,我都会尝试创建下面类的实例,然后将这些实例存储在数组中,以便以后可以访问它们的数据。然后,我尝试使用存储在数组中的实例中的特定字段填充表视图。我一直有一些问题,因为我很熟悉C++,并用向量做这种事情,然后只是根据我需要的索引访问,但这让我揪了我的头发!谢谢,代码如下: eventDetails.h: @interface eventDetails : NSObject { NSString *eventName, *eventID; } -(vo

因此,基本上,每次我从web请求收到有效响应时,我都会尝试创建下面类的实例,然后将这些实例存储在数组中,以便以后可以访问它们的数据。然后,我尝试使用存储在数组中的实例中的特定字段填充表视图。我一直有一些问题,因为我很熟悉C++,并用向量做这种事情,然后只是根据我需要的索引访问,但这让我揪了我的头发!谢谢,代码如下:

eventDetails.h:

@interface eventDetails : NSObject {
NSString *eventName, *eventID;
}

-(void) setEventID : (NSString *) ID;
-(void) setEventName: (NSString *) name;
-(NSString *) getEventName;
-(NSString *) getEventID;
还要注意的是

 NSMutableArray *events
在my.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验证程序[90982:207]条目ID:701,名称为iPhone测试事件 2011-04-09 18:53:24.625验证器[90982:207]条目ID:784,名称另一个iPhone测试事件 2011-04-09 18:53:24.626验证器[90982:207]条目ID: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_访问,我说:

 cell.textLabel.text = cellValue;

谢谢你的帮助。我想我可能在声明eventDetails类的实例时出错了,但我不确定,因为它在存储数据方面工作正常。如果您需要更多的代码,我会提供缺少的部分。

您发布的代码中有太多遗漏的细节,无法确定,但我猜,
eventName
没有保留,并且在您尝试使用它之前的某个时间被释放

检查您的
setEventName:
实现;它需要将
retain
copy
发送到
name
参数,以确保在使用完字符串之前不会释放该字符串。然而,如果你想避免内存泄漏,情况要比这复杂得多,因此如果你还没有这样做,我建议你阅读内存管理,特别是苹果优秀的内存管理编程指南。(注:由于苹果不断更改链接,我已放弃发布链接)

旁注:不要在访问器方法的名称前加上单词
get
;在java或C++中,这是很好的,但是这是Objto-C。
- (NSString *)eventName;
- (NSString *)eventID;

不能保证依赖内省的基础机制能正确地工作,而不遵循记录的命名约定,所以这是另一回事。p> 在您发布的代码中,
events
未声明为实例变量,因此我不确定您所说的“
events
在我的.h文件中声明”是什么意思。如果不是实例变量,
events
在哪里定义?对,这不是很清楚。事件是此特定viewController的实例变量。在这个视图控制器的.h文件(我没有发布)中,我声明了NSMutableArray*事件;然后在控制器的viewDidLoad中初始化它。谢谢谢谢我改变了这些访问器,读了一点,所以我现在明白了这是多么重要。我读了你提到的文章和其他几篇关于Objective C内存管理的文章,正如你所建议的,它们都提到在setter中保留引用。但是,为了避免泄漏,如果我将setter设置为:-(void)eventID:(NSString*)ID{eventID=[ID retain];}只要调用[[eventName objectAtIndex:indexPath.row]release],我就可以-(void)dealoc{[eventID release];};当我在我的主程序中完成它时?不完全是。我建议多花点时间阅读《内存管理指南》。这需要一点时间来了解全貌,我想你会发现没有它你真的走不了多远。