在ipad中滚动时,uitableview崩溃了

时间:2011-06-01 10:05:59

标签: iphone objective-c uitableview uiscrollview

大家好我用以下代码实现了自定义的UITableViewcell。每个单元格加载了四个图像..

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

static NSString *hlCellID = @"hlCellID";

UITableViewCell *hlcell = [tableView dequeueReusableCellWithIdentifier:hlCellID];
if(hlcell == nil) {
    hlcell =  [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:hlCellID] autorelease];
    hlcell.accessoryType = UITableViewCellAccessoryNone;
    hlcell.selectionStyle = UITableViewCellSelectionStyleNone;
    [hlcell.contentView removeAllSubViews];


}
//NSLog(@"the scetions is %@",sections);

int section = indexPath.section;


for(int i=0;i<4;i++){


    CGRect rect = CGRectMake(18+192*i, (4*indexPath.row)+50, 120, 150);

    if ((4*indexPath.row)+i>=[self.imagesToDisplay count]) {
        break;
    }
    UIImage *imageToDisplay=[UIImage imageWithData:[self.imagesToDisplay objectAtIndex:(4*indexPath.row)+i]];
    NSLog(@"The size of the image is:%@",NSStringFromCGSize(imageToDisplay.size));
    UIButton *button=[[UIButton alloc] initWithFrame:rect];
    [button setFrame:rect];

    [button setBackgroundImage:imageToDisplay   forState:UIControlStateNormal];
    [button setContentMode:UIViewContentModeCenter];

    NSString *tagValue = [NSString stringWithFormat:@"%d%d",indexPath.row,i];
    NSLog(@"the tag is %@",tagValue);
    button.tag = [tagValue intValue];
    NSLog(@"....tag....%d", button.tag);
    [button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
    [hlcell.contentView addSubview:button];
    [button release];
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(18+192*i,(4*indexPath.row)+100+70 , 100, 100)] ;
    label.text = @"price $0.99";
    label.textColor = [UIColor blackColor];
    label.backgroundColor = [UIColor clearColor];
    label.textAlignment = UITextAlignmentCenter;
    label.font = [UIFont fontWithName:@"ArialMT" size:12]; 

    [hlcell.contentView addSubview:label];
    [label release];


}


return hlcell;

}

每个图像的

充当uibutton.i我试图加载大约1000张图像。我从服务器上拍摄的这些图像。当一个图像加载到我的应用程序时,我正在更新整个单元格。

NSIndexPath *indexPath=[NSIndexPath indexPathForRow:ceil((float)[gridView.imagesToDisplay count]/4)-1 inSection:0]; NSArray *cellIndexPath=[NSArray arrayWithObjects:indexPath,nil]; [gridView.tableview reloadRowsAtIndexPaths:cellIndexPath withRowAnimation:UITableViewRowAnimationNone];

到目前为止我的代码工作正常,当我尝试在加载所有图像后多次滚动它会崩溃。我的GDB显示为内存警告。任何人都建议我为什么会出现这个问题。谢谢你的回复提前。

1 个答案:

答案 0 :(得分:0)

看起来你总是分配新的图像并在Cell上显示它们,但是当不再显示单元格时,你永远不会实际释放图像。

UITableView单元格的定义指出,一旦不再使用单元格,它就会被清除并为新内容做好准备。在您的代码中,您始终会向单元格添加新的子视图,但从不实际发布内容。

您的问题的最佳解决方案是通过对其进行子类化并手动设置图像来实现UITableViewCell。进一步实施

- (void)prepareForReuse

类的方法来释放当前显示的图像。有关UITableViewCell

的更多文档,请参阅参考资料