在自定义单元类应用程序中释放对象时崩溃

Posted

技术标签:

【中文标题】在自定义单元类应用程序中释放对象时崩溃【英文标题】:When releasing the objects in the custom cell class app crashes 【发布时间】:2012-12-01 11:14:35 【问题描述】:

当我的自定义 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];

【问题讨论】:

标签,按钮,在那里。都是设置为属性的实例变量吗? ***.com/questions/7402171/… 发现这篇文章很有帮助.. 【参考方案1】:

如果您在表格视图单元格的 dealloc 中执行 [sfdfbutton release],您可能会过度释放您的 UIButton: sfdfbutton。那是因为它是自动释放的对象。

如果这不是问题,请尝试使用 Instruments 运行应用程序。

【讨论】:

标签,按钮,在那里。都是设置为属性的实例变量吗? 他是对的,按钮是自动释放的。你从 buttonWithType 得到它并且不保留它.. 最干净的 IMO 将它保留在那里 顺便说一句,有很多代码丢失...您使用各种按钮,而 sdsdbutton 从未用于任何事情...【参考方案2】:

要解决此类问题,请在启动应用时将 NSZombieEnabled 设置为 YES(产品 > 编辑方案...并将其添加到环境变量中)。

这将准确指出哪个变量被过度释放。您还可以通过键入 Cmd+Shift+B 对程序执行静态分析。

【讨论】:

分析和仪器显示完全没有泄漏。当我在 dealloc 发表评论时,一切正常

以上是关于在自定义单元类应用程序中释放对象时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

UIbutton 在自定义 UITableViewCell 中释放

在自定义 UlTableViewCell 中使用 UITextField 时 resignFirstResponder 崩溃

在自定义 UITableViewCell 上使用图像时 IOS 8 崩溃

释放自动释放对象不会使我的应用程序崩溃,为啥?

AUParameterTree 释放导致死锁

如何在自定义滑动(而不是滑动删除)单元格(滑动到邮件/短信)中点击一个单元格时删除在其他 TableView 单元格中添加的子视图