nessenceにはたくさんの良い情報があります。さらにいくつかの考え:
あなたはここで狂ったように漏れています。作成するすべてのセルで、UIImageView と UIImage の 2 つの UILabels がリークします。
前に述べたように、これらをリークしているだけでなく、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、Practical Memory Management、およびCocoa のコーディング ガイドライン の学習に時間を費やすことをお勧めします。Cocoa の基本を少し勉強することも役に立ちます。ここでのコーディング スタイルは、確かな基盤がない可能性があることを示しているからです。これは Mac の本ですが、やはりCocoa Programming for Mac OS X をお勧めします。これを使用して iPhone を学習することに興味がある場合は、役立つシラバスをまとめました。まだレビューしていませんが、スタンフォード大学のオンラインCS193P コースは有望に見えます。