Несущество имеет много хорошей информации. Еще несколько мыслей:
Ты протекаешь как сумасшедший. В каждой ячейке, которую вы создаете, вы теряете 2 UILabels, UIImageView и UIImage.
Как отмечалось ранее, вы не только пропускаете их, они накапливаются в вашем представлении, потому что вы помещаете один поверх другого с помощью addSubview:.
Доступ к сети во время извлечения ячейки невероятно медленен и блокирует ваш пользовательский интерфейс. Если эти URL-адреса являются локальными, то вы можете использовать UIImage + imageWithContentsOfFile, если нет, вам нужно загрузить его в фоновом режиме.
Я не думаю, что вам нужна нить здесь. NSURLConnection - это отличный способ загрузки данных в фоновом режиме без дополнительных затрат на многопоточность.
Несущественно, что вам нужен класс модели для Story.
Ваш базовый подход к конфигурации многоразовой ячейки неверен. Вы не получаете повторно используемую ячейку, а затем добавляете в нее подпредставления. Все ваши подпредставления должны быть добавлены в блок if () для создания ячейки. Затем на каждом проходе вы просто меняете ценности вещей. Я переписал часть вашего кода ниже, чтобы продемонстрировать. Это все еще не правильный код, потому что он обращается к сети во время отрисовки ячейки, и это может быть слишком много элементов, чтобы быть в ячейке подпредставления (а не в пользовательской ячейке), но это ближе к правильной идее. Я даже не знаю, компилируется ли это; Я просто набрал его здесь.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *MyIdentifier = @"MyIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
if (cell == nil) {
// Here we do all our cell creation
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];
// Make the label
CGRect aframe = CGRectMake(80, 30, 250, 40);
UILabel *textLabel = [[[UILabel alloc] initWithFrame:aframe] autorelease]; // Note the -autorelease so we don't leak
textLabel.font = [UIFont boldSystemFontOfSize:14];
textLabel.numberOfLines=0;
textLabel.textColor = [UIColor darkTextColor];
textLabel.backgroundColor = [UIColor whiteColor];
textLabel.tag = DescriptionTag; // A tag so we can find it later (you'll need a constant for this)
[cell.contentView addSubview:textLabel];
// And the second label
aframe = CGRectMake(80, 30, 250, 40);
textLabel = [[[UILabel alloc] initWithFrame:aframe] autorelease];
textLabel.font = [UIFont boldSystemFontOfSize:14];
textLabel.numberOfLines=0;
textLabel.textColor = [UIColor darkTextColor];
textLabel.backgroundColor = [UIColor whiteColor];
textLabel.tag = TitleTag;
[cell.contentView addSubview:textLabel];
// The image view
CGRect frame = CGRectMake(0, 0, 70,80);
UIImageView *topImageView = [[[UIImageView alloc] init] autorelease];
topImageView.frame = frame;
topImageView.tag = TopImageTag;
[cell.contentView addSubview:topImageView];
}
// all the above was cell creation; we do that as seldom as possible.
// Now we do cell configuration. We want this to be fast.
UILabel *descriptionLabel = (UILabel*)[cell.contentView viewWithTag:DescriptionTag];
descriptionLabel.text = itemDescription;
UILabel *titleLabel = (UILabel*)[cell.contentView viewWithTag:TitleTag];
titleLabel.text =[[stories objectAtIndex:indexPath.row] objectForKey:@"title"];
NSString *imageURLString = [m_imglinkArray objectAtIndex:storyIndex]; // You should have a model class called Story, not two arrays.
UIImage *image = [[[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:imageURLString]]] autorelease]; // This is still way too slow if it's a remote URL
UIImageView *imageView = (UIImageView*)[cell.contentView viewWithTag:TopImageTag];
imageView.image = image;
return cell;
}
Я рекомендую вам потратить некоторое время на изучение TableViewSuite , Практическое управление памятью и Рекомендации по кодированию для какао . Некоторое время изучения основ какао также было бы полезно, потому что стиль кодирования здесь указывает на то, что у вас может не быть прочной основы. Хотя это книга для Mac, я все же рекомендую Программирование Какао для Mac OS X . Если вы заинтересованы в использовании этого для изучения iPhone, я собрал учебный план , который может помочь. Я еще не рассмотрел его, но онлайн-курс Стэнфорда CS193P * 1027 * выглядит многообещающе.