1

私が電話した場合:

-[UITableView dequeueReusableCellWithIdentifier]

次に、この方法でセルを再利用しないことを選択します

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

リークは必然的に発生しますか?私の推測ではdealloced、自動解放プールが空になるとすぐになります。

4

4 に答える 4

3

はい、これによりリークが発生します。サブクラス化して経験的にこれを試してくださいUITableViewCell

static int instances = 0;
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        NSLog(@"Init! instances=%d", instances++);
    }
    return self;
}

-(void)dealloc {
    NSLog(@"Dealloc! instances=%d", --instances);
}

戻ってきたセルを使用しないdequeueReusableCellWithIdentifierと、リークが発生します。

この問題には 2 つの解決策があります。

  1. の結果をdequeueReusableCellWithIdentifier想定どおりに使用するか、
  2. として使用nilreuseIdentifierます。リークは発生しません。テーブルに多くの行があり、再利用の混乱に対処したくない場合を除き、これが最善の解決策です。
于 2013-03-24T21:40:46.433 に答える
2

はい、dequeueReusableCellWithIdentifier自動解放されたオブジェクトを返します。メモリ リークは発生しません。

ただし、(何らかの理由で) セルを再利用しないことを選択した場合は、dequeueReusableCellWithIdentifier最初に呼び出す必要はありません。

更新:次のコードを使用して、内部再利用キューに格納されているセルの数を確認できます。

NSDictionary *reuseDict = [self.tableView valueForKey:@"reusableTableCells"];
NSArray *reuseArray = [reuseDict objectForKey:CellIdentifier];
NSLog(@"%d", [reuseArray count]);

への呼び出しを削除した Master-Detail Xcode アプリケーションでこれをテストしましたdequeueReusableCellWithIdentifier。再利用キュー内のセルの数は、横向きで最大 17 個、縦向きで最大 23 個に増加しました。これは、目に見えるセルの数に 1 を加えたものです。したがって、細胞を再利用しないとしても、その数は確かに限られています。

于 2013-03-22T21:00:25.947 に答える
0

いいえ、これによってリークが発生することはありませんが、必ずしもメモリ効率が良いとは限りません。これらすべてのセル再利用の雑用を自動的に処理したい場合は、優れた Sensible TableView (無料) などのフレームワークの使用を検討してください。

于 2013-03-23T22:03:04.443 に答える