nessence有很多很好的信息。还有一些想法:
你在这里像疯了一样漏水。您创建的每个单元格都会泄漏 2 个 UILabel、一个 UIImageView 和一个 UIImage。
如前所述,您不仅泄漏了这些,它们还在您的视图中累积,因为您使用 addSubview: 将一个放在另一个之上。
在单元格绘制期间访问网络非常慢,并且会阻塞您的 UI。如果这些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、实用内存管理和Cocoa 编码指南。花些时间学习 Cocoa 的基础知识也会很有用,因为这里的编码风格表明你可能没有扎实的基础。虽然这是一本 Mac 书,但我仍然推荐Cocoa Programming for Mac OS X。如果您有兴趣使用它来学习 iPhone,我整理了一个可能会有所帮助的教学大纲。我还没有复习,但斯坦福的在线CS193P 课程看起来很有希望。