Use UITableView dequeueReusableCellWithIdentifier:
This basically means that you don't have to recreate the table cell from scratch every time. If you give a cell a reuse identifier, it will keep ahold of that cell in memory and let you dequeue it when you ask for a cell matching that identifier.
Since every cell has a unique image, you'd probably be best off setting each cell's unique identifier as something from the image - perhaps the image's URL or filename. This will eat up more memory than disposing of and recreating the cells, but it reduces scroll lag, and if your images are small then the memory footprint isn't that large.
You'd probably end up with something like:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *imageURL = urlOfImageForThisCell;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:imageURL];
if(!cell)
{
cell = [self makeNewCell];
//if your reuseIdentifier is unique to each image, you only ever need to set it's image here
cell.image = imageForThisCell;
cell.reuseIdentifier = imageURL;
}
//additional cell setup here
return cell;
}
You'll also want to look in subclassing UITableViewCell and overriding prepareForReuse.