4

次のように、各カスタムセルにサブビューとして追加する UIButton とともに、テーブルビューを使用するアプリがあります。

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];

    checkButton = [[UIButton buttonWithType:UIButtonTypeCustom] initWithFrame:CGRectMake(2.0, 2.0, 40.0, 40.0)];
    [cell.contentView addSubview:checkButton];

    // lot's of other code

    return cell;
}

Instrumentsを使用してメモリリークがないことを確認するまでは問題ないと思っていましたが、UIButtonをセルのサブビューとして追加すると、何らかの形でUIKit内でリークが発生することがわかりました。

具体的には、セル行ごとに (ボタンがサブビューとして追加されるたびに) メモリリークが発生し、リークされたオブジェクトは「-[UIView _createLayerWithFrame:]」である責任フレームを持つ「CALayer」です。

ここで何か間違ったことをしていますか?

4

3 に答える 3

5

コード [UIButton buttonWithType] メソッドには、initWithFrame メソッドが既に含まれています。CGRectMake を使用して、ボタンのフレームを設定するだけです。

rectangle = CGRectMake(2.0f,2.0f,40.0f,40.0f);
checkButton = [UIButton buttonWithType:UIButtonTypeCustom];
checkButton.frame = rectangle;
于 2010-02-22T19:17:32.333 に答える
0

これを物理デバイスまたはシミュレーターでテストしましたか?

シミュレーターには、実際のデバイス コードと比較して、いくつかのメモリ管理のバリエーションがあることが知られています。実際のデバイスで常にメモリ リーク テストを実行する必要があります。

そうでなければ、あなたのコードは私には正しいように見えます。

于 2010-02-22T19:16:27.763 に答える
0

checkButton はあなたのクラスの @property(retain) ですか?

その場合、使用後にプロパティを null に設定する必要があります...しかし、セルのセルライフサイクルはあなたの管理下にないため、それはできません。ローカル変数を使用したほうがよいでしょう。

また、addSubview コードが独自の保持/解放を行うため、addSubview の後に [checkButton release] を配置する必要があります。

于 2010-02-22T19:16:30.557 に答える