2010-12-03 7 views
2

ちょうどペンから作成されたカスタムUITableViewCellsを使用する方法を示すApple docsから取得したコードを追加しました。私はiOS開発の初心者です。だから、私はまだ適切なメモリ管理について学んでいますし、コードは最初の仕組みについて私にはっきりと分かりません。 Allocationsを実行すると、以下のコードに未割り当てのメモリが表示されます。具体的には、iOS開発:このコードでメモリをどのように誤って管理していますか?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{  
    static NSString *CellIdentifier = @"MyCustomCellIdentifier"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     [[NSBundle mainBundle] loadNibNamed:@"MyCustomCell_iPhone" owner:self options:nil]; //<--Allocations instrument complaining about this line 
     cell = customCell; 
     [self setCustomCell:nil]; 
    } 

    return cell; 
} 

customCellそう...

IBOutlet UITableViewCell *customCell; 
@property (nonatomic, retain) IBOutlet UITableViewCell *customCell; 
ように、このビューコントローラで定義されたインスタンスのVARは...ビューコントローラがNAVスタックからポップされた後UITableViewCells生き残る示します

このコードに問題はありますか?

あなたの知恵に感謝します。あなたのコードで

if (cell == nil) { 
    [[NSBundle mainBundle] loadNibNamed:@"TVCell" owner:self options:nil]; 
    cell = tvCell; 
    self.tvCell = nil; 
} 

+0

うまくいけば、customCellという@プロパティも定義されているといいですか? –

+0

カスタムセルをIBOutletにする必要はありますか?あなたがカスタム販売をロードしようとしているのであれば、それをコンセントにする必要はありません。 – DerekH

+0

DerekH、それは、ペン先がロードされたときにセルのハンドルを配線することができるように、コンセントにする必要があります。 –

答えて

2

私はドキュメントからのコードと比較

if (cell == nil) { 
    [[NSBundle mainBundle] loadNibNamed:@"MyCustomCell_iPhone" owner:self options:nil]; 
    cell = [self customCell]; 
    [self setCustomCell:nil]; 
} 

をあなたはcellを割り当てるラインで格差があるようです。 AppleのサンプルコードはtvCellインスタンス変数を使用しますが、[self customCell]、のプロパティゲッターを使用します。それが原因だろうか?メモリが懸念している限り、

cell = customCell; 
+0

ありがとう、ボルト、私はそれを試してみました。 Allocationsの計測器は、View ControllerがNavスタックからポップされた後もUITableViewCellが有効であると報告しています。 – BeachRunnerFred

+0

それをキャッチするために感謝します。それは助けに見えなかったが、他の場所に影響を与える可能性がある。問題は、セルを保持しているUITableViewが正しく割り当て解除されていないことでした。あなたの助けをもう一度おねがいします。 – BeachRunnerFred

+0

@BeachRunnerJoe:問題はありません、あなたはそれが最後に追跡されてうれしいです。 – BoltClock

1

あなたのコードは、私にはよさそうに

cell = [self customCell]; 

を変更してみてください。

私が起こっていることは、あなたのView Controllerがリリースされていないことです。 ObjectAllocでは、ビュー・コントローラーによって保持されているテーブル・ビューによって保持されているため、表のセルが保持されていることがわかります...

これが最も一般的な理由はビューコントローラをdeallocのnilへのデリゲートとして使用するものを設定することを忘れてしまいます。

また、テーブルビューを解放していない可能性もありますが、そうは思われません。 ObjectAllocでは、View Controllerを終了した後、View Controller自体もメモリ内にあるかどうかを確認します。

0

デバッガを使用します。 deallocにブレークポイントを設定します。あなたがnavコントローラをポップするときに呼び出されていますか?

関連する問題