0

インターフェイス ビルダーを使用して設計したテーブル ビューのカスタム セルがあります。その .m ファイルには、カスタム セルのバンドルから xib を取得するための次のようなコードがあります。

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        NSArray *nibArray = [[NSBundle mainBundle] loadNibNamed:@"SubItemsCustomCell" owner:self options:nil];
        self = [nibArray objectAtIndex:0];    }
    return self;
}

次に、このセルを cellForRowAtIndexPath メソッドで使用して自動解放メッセージを渡すと、

if (!cellForSubItems) {
    cellForSubItems = [[[SubItemsCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"SubItemCell"] autorelease];
}

メッセージを表示してtableViewをスクロールするとクラッシュします。

-[SubItemsCustomCell release]: message sent to deallocated instance 0xed198b0

コードを使用してカスタム セルを作成したときにクラッシュすることはありませんでしたが、ここではクラッシュします。なぜですか?? また、自動解放しないと、まったく問題なく動作しますが、明らかにメモリリークが発生します。親切にこれで私を助けてください。前もって感謝します。

編集:私はARCを使用していません。

4

2 に答える 2

2

init メソッドは非常に間違っているようです。

呼び出された時点で、オブジェクトはすでに割り当てられています。次に、そのオブジェクトをペン先からロードしたものに置き換えます。ここでは、最初にリリースする必要がある古いインスタンスを既にリークしています。nib からの新しいオブジェクトは自動解放されるため (命名規則を参照)、ここで保持する必要があります。

その偽のコードを完全に削除することを強くお勧めします。手動で alloc/init を呼び出す必要はありません。そこにある nib の何かに置き換えるだけです。ペン先から直接ロードします。

はい、コードがリークする可能性がありますが、おそらくあなたが考えていた方法ではありません。

于 2012-10-04T11:59:07.907 に答える
1

セルを追加するための次のコードを試してくださいUITableView

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        SubItemsCustomCell *cell = (SubItemsCustomCell *) [tableView      dequeueReusableCellWithIdentifier:nil];

        if (cell == nil) 
        {

            NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"SubItemsCustomCell" owner:self options:nil];

            for (id currentObject in topLevelObjects){
                if ([currentObject isKindOfClass:[UITableViewCell class]]){
                    cell =  (SubItemsCustomCell *) currentObject;
                    break;
                }
            }
             ///do something here
        }

        return cell;
    }

これがお役に立てば幸いです...

:)

于 2012-10-04T11:51:29.400 に答える