3

カスタムTableViewCellがリリースされると、アプリがクラッシュするという問題があります。私が試したコードを以下に示します。変数の名前には当てはまりませんでした。

セルは、cellForRowAtIndexPathで次のように初期化されます。

static NSString *CellIdentifier1 = @"CellIdentifier";
    static NSString *CellIdentifier2 = @"Cell";
     if (indexPath.section == 0 && indexPath.row==0)
    { 
         CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier1];
       if (cell == nil)
        {
            cell = [[[CustomCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier1] autorelease];
            cell.backgroundView = [ [[UIImageView alloc] initWithImage:[ [UIImage imageNamed:@"dfdfdf.png"] stretchableImageWithLeftCapWidth:0.0 topCapHeight:5.0] ]autorelease];
        }
   [cell.fgfbutton addTarget:self action:@selector(callAction:) forControlEvents:UIControlEventTouchUpInside];     
 cell.myImageView.image=[UIImage imageNamed:@"fdfdfdf.png"];
    cell.fddfdbutton.tag=indexPath.section+1;
       return cell;

    }
    else if (indexPath.section == 1 && indexPath.row==0) 
    {
        Customcellwithimage *cell = (Customcellwithimage *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier2];

        if (cell == nil)
        {
            cell = [[[Customcellwithimage alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier2] autorelease];
             cell.backgroundView = [ [[UIImageView alloc] initWithImage:[ [UIImage imageNamed:@"fetrtrtrt.png"] stretchableImageWithLeftCapWidth:0.0 topCapHeight:5.0] ]autorelease];
        }

         cell.selectionStyle = UITableViewCellSelectionStyleNone;

        [cell.dfdfbutton1 addTarget:self action:@selector(callAction:) forControlEvents:UIControlEventTouchUpInside]; 


        return cell;


    }

カスタムセルクラスでは、deallocメソッドでセルオブジェクトをリリースしています。カスタムセルでは、次のように実行しています。

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        nameLabel = [[UILabel alloc]init];
        [nameLabel setFont:[UIFont fontWithName:@"Helvetica-Bold" size:16]];
        nameLabel.textAlignment = UITextAlignmentLeft;
        nameLabel.textColor = [UIColor blackColor];
        nameLabel.numberOfLines = 0;

        nameLabel.backgroundColor =[UIColor clearColor];
        nameLabel.adjustsFontSizeToFitWidth = NO;

       sfdfbutton = [UIButton buttonWithType:UIButtonTypeCustom];

        [sdsdbutton setImage:[UIImage imageNamed:@"_it.png"] forState:UIControlStateNormal];
        [sdbutton setImage:[UIImage imageNamed:@"ed.png"] forState:UIControlStateSelected]; 
        sdsdbutton.selected=NO;

            myImageView = [[UIImageView alloc] init];
        bottomborder=[[UIImageView alloc] init];
        UIImage *img1 = [UIImage imageNamed:@"_bg.png"];
        [bottomborder setImage:img1];

        [self.contentView addSubview:nameLabel];

        [self.contentView addSubview:myImageView];

    }
    return self;
}
- (void)layoutSubviews {
    [super layoutSubviews];
    //CGRect contentRect = self.contentView.bounds;
    //CGFloat boundsX = contentRect.origin.x;
    CGRect frame;

    //frame= CGRectMake(0 ,0, 300, 135);
    //cellview.frame = frame;
    frame= CGRectMake(60 ,8, 220, 20);
    nameLabel.frame = frame;

    myImageView.frame = CGRectMake(10,6,40,40);
    NSLog(@"nameLabel frame: %@", NSStringFromCGRect(myImageView.frame));
    nhghbutton.frame =CGRectMake(4,12 + frame.origin.y + frame.size.height, 82, 35);

}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];


}
- (void)dealloc {

   [bottomborder release];
   [myImageView release];
   [label release];
   [super dealloc];
}
4

2 に答える 2

1

テーブルビューセルのdeallocで[sfdfbuttonrelease]を実行すると、UIButton:sfdfbuttonが過剰に解放されている可能性があります。自動解放されたオブジェクトだからです。

これが問題にならない場合は、Instrumentsでアプリケーションを実行してみてください。

于 2012-12-01T11:19:39.343 に答える
-1

この種の問題を解決するには、 ([製品]> [スキームの編集...]にNSZombieEnabled設定してアプリを起動YESし、これを環境変数に追加します)。

これにより、どの変数がオーバーリリースされるかが正確に示されます。Cmd + Shift + Bと入力して、プログラムの静的分析を実行することもできます。

于 2012-12-01T11:21:12.840 に答える