2012-04-02 5 views
0

カスタムセルの漏れに問題があります。私の上書きのUITableViewControllerでカスタムセルのリーク

、私はそこに対応するNIBは、カスタムセル(TwitterTweetTableCell)のためである、と述べたように

- (TwitterTweetTableCell *) initWithTable:(UITableView *) tableView 
    andTweet:(NSDictionary *) tweet 
{ 

    tweetCell = nil; 

    // ************************************************************************************ 
    // The identifier used in the following dequeue is the one set in the corresponding nib 
    // ************************************************************************************ 

    tweetCell = (TwitterTweetTableCell *) 
     [tableView dequeueReusableCellWithIdentifier:@"tweetCell"]; // <-- set this in NIB 

    if (tweetCell) 
    { 
     NSLog(@"tweetCell: Reuse!"); 
    } 

    if(!tweetCell) 
    { 
     NSArray *topLevelObjects = [[NSBundle mainBundle] 
       loadNibNamed:@"TwitterTweetTableCell" owner:nil options:nil]; 

     for(id currentObject in topLevelObjects) 
     { 
      if([currentObject isKindOfClass:[TwitterTweetTableCell class]]) 
      { 
       tweetCell = (TwitterTweetTableCell *)currentObject; 

       break; 
      } 
     } 

     // yadda, yadda, yadda 

     [tweetCell retain]; 
    } 

    return tweetCell; 
} 

- (UITableViewCell *)tableView:(UITableView *) tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    TwitterTweetTableCell *cell = nil; 

    // Obtain the cell... 

    cell = [[TwitterTweetTableCell alloc] 
      initWithTable:tableView 
       andTweet:[[self getTimeline] objectAtIndex:indexPath.row]]; 

    return [cell autorelease]; 
} 

と、対応する上書きのUITableViewCellクラスで、持っていますコードでは、セルの識別子がそこに 'tweetCell'に設定されています。

楽器によると、それは私が(それはとにかく、アロケーションからの復帰だと1のretainCountで細胞を返すには、私が正しいんだと信じてい:-(

細胞をリークし、以外のコードは、正常に動作します私がいない場合には、コードが示すように、私は最終的に表コントローラにそれを渡す前に、それを自動解放。)ゾンビでクラッシュ。この漏れはいただければ幸い理由について

思考。

答えて

0

問題ここではcellForRowAtIndexPath:では、カスタムセルの新しいインスタンス用にメモリを割り当てていますが、cの初期化子にはあなたはselfを返さず、代わりに再利用可能な既存のセルを返すか、ペン先から新しいものをインスタンス化するので、割り当てたメモリを実際に使用することはありません。

あなたはinitWithTable:andTweet:メソッドが実際にイニシャライザではないので、代わりに自動解放されたインスタンスを返す便利なメソッドに変更する必要があります。メソッドのシグネチャを変更し、

+ (TwitterTweetTableCell *) cellWithTable:(UITableView *) tableView 
andTweet:(NSDictionary *) tweet 

が、それはその戻り値を自動解放作る

return [tweetCell autorelease]; 

、その後cellForRowAtIndexPath:でわずかに異なる呼び出しを行うと、あなたはすべてのセットになるでしょう:

return [TwitterTweetTableCell cellWithTable:tableView 
            andTweet:[[self getTimeline] objectAtIndex:indexPath.row]]; 
+0

優秀!非常に明確で、有益な、そして、すべてのベストな;-)それは問題を修正しました。私はそれからたくさんのことを学びました - ありがとう、ゆじ。 – Snips