2009-08-03 23 views
0

私はテストするためにコードを単純化しましたが、まだ電話で私のメモリ使用量は、テーブルが遅くなるポイントまで上昇し続けます。なぜ表セルが解放されないのですか?

誰かが私がここで間違っていることを教えてもらえますか?

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return 40; 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    return 100; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *cellID = @"Cell"; 
    [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellID]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:cellID] autorelease]; 
    } 
    UILabel *l=[[UILabel alloc] initWithFrame:CGRectMake(10,10,300,16)]; 
    l.font=[UIFont boldSystemFontOfSize:15]; 
    l.textColor=[UIColor whiteColor]; 
    l.backgroundColor=[UIColor blackColor]; 
    [email protected]"Just some randoom text here"; 
    [cell.contentView addSubview:l]; 
    [l release]; 

おっと。そのコードペーストはあまりうまく動かなかった。ここではストレートペーストです:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return 40; 
} 


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    return 100; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *cellID = @"Cell"; 
    [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellID]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:cellID] autorelease]; 
    } 
    UILabel *l=[[UILabel alloc] initWithFrame:CGRectMake(10,10,300,16)]; 
    l.font=[UIFont boldSystemFontOfSize:15]; 
    l.textColor=[UIColor whiteColor]; 
    l.backgroundColor=[UIColor blackColor]; 
    [email protected]"Just some randoom text here"; 
    [cell.contentView addSubview:l]; 
    [l release]; 
     return cell; 
} 

答えて

0

あなたはUITableViewCellのインスタンスをリサイクルしている、あなたはまだ行ごとに新しいUILabelのインスタンスを作成し、それぞれ、すべてのセルにそれを追加しています。これがメモリ使用量の原因です。このような何かを試してみてください:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *cellID = @"Cell"; 
    [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellID]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:cellID] autorelease]; 
     UILabel *l=[[UILabel alloc] initWithFrame:CGRectMake(10,10,300,16)]; 
     l.font=[UIFont boldSystemFontOfSize:15]; 
     l.textColor=[UIColor whiteColor]; 
     l.backgroundColor=[UIColor blackColor]; 
     [email protected]"Just some randoom text here"; 
     [cell.contentView addSubview:l]; 
     [l release]; 
    } 
    return cell; 
} 
1

あなたはこのようなパターンに従うことになるでしょう:すべてのUITableViewCellのは、独自の標準UILabel(cell.textLabel)を持っているので

#define kTagMyLabel 1 

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *cellID = @"Cell1"; 
    UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellID]; 
    UILabel * l; 
    if (cell == nil) { 
    // create the cell 
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:cellID] autorelease]; 

    // perform setup/functions that are common to all cells 
    l = [[[UILabel alloc] initWithFrame:CGRectMake(10,10,300,16)] autorelease]; 
    l.font=[UIFont boldSystemFontOfSize:15]; 
    l.textColor=[UIColor whiteColor]; 
    l.backgroundColor=[UIColor blackColor]; 
    l.tag = kTagMyLabel ; 
    [cell.contentView addSubview:l]; 
    } 
    else 
    { 
    // find the label we previously added. 
    l = (UILabel*)[cell viewWithTag:kTagMyLabel]; 
    } 

    // now set up the cell specific to this indexPath 
    [email protected]"Just some random text here"; 
    return cell; 
} 
+0

このソリューションでは、残念なことにメモリペグも(ストレートコピー&ペースト)。 おそらく、それはテーブルビューが配置される方法です。 IBでタブバーコントローラを作成し、IBのビューコントローラも割り当てます。 autoreleasepoolは決して解放する機会を得ないでしょうか?何が良い方法だろうか? NSAutoreleasePoolをmain以外の場所に置いて、これを解放する必要がありますか?その場合、ビュー自体がタブバー位置にあるということはどこから解放されないのでしょうか? –

+0

これが何かを意味するかどうかは分かりませんが、Simulatorではメモリが適切に解放されます。 –

+0

すべてのUIイベントの後にプールが排水されます。 *正確に*はリリースされていませんか?つまり、いつメモリがなくなるのでしょうか?長いアイテムのリストをスクロールしてから、あなたのViewControllerから戻ってきますか?あなたはどこか他の場所に漏れがあります。 – Jason

0

を、あなたは本当に余分なラベルが必要なのかcontentViewに追加されましたか?カスタムセルが必要な場合は、UITableViewCellのサブクラス化を検討するとよいでしょう。

+0

私が与えた例はちょうど対になったバージョンでした。実際のコードでは、UITableviewCellをサブクラス化し、いくつかのフィールドとイメージを追加します。 –

関連する問題