代码之家  ›  专栏  ›  技术社区  ›  vikingosegundo

在[super dealloc]弹出视图崩溃应用程序

  •  0
  • vikingosegundo  · 技术社区  · 15 年前

    我有一个 tableView:didSelectRowAtIndexPath: 在这里,我每次选择一个项目时都创建一个viewcontroller实例。有时它可以工作很长时间,有时它崩溃与 EXC_BAD_ACCESS 很快。调试程序将此行归咎于 [super dealloc]; 在QuestionDetailView控制器中。

    为什么?我记录问题详细信息视图控制器重新计数。看起来不错。

    问题详细视图控制器

    #import <UIKit/UIKit.h>
    #import "Question.h"
    #import "Answer.h"
    @interface QuestionDetailViewController : UIViewController < UIScrollViewDelegate , QuestionDetailViewProtocol> {
        Question *question;
        UILabel *answerText;
        UILabel *titleLabel;
    }
    
    @property(nonatomic,retain) Question *question;
    @property(nonatomic,retain) UILabel *answerText;
    @property(nonatomic,retain) UILabel *titleLabel;
    
    @end
    
    
    #import "QuestionDetailViewController.h"
    @implementation QuestionDetailViewController
    @synthesize question;
    @synthesize answerText;
    @synthesize titleLabel; 
    
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    }
    
    - (void)viewWillAppear:(BOOL)animated {
        UIColor *bgColor = [UIColor colorWithRed:199.0/255 green:234.0/255 blue:251.0/255 alpha:1];
        self.answerText = (UILabel *)[self.view viewWithTag:2]; 
        self.answerText.backgroundColor = bgColor;
        self.answerText.text = self.question.answer.text;
        self.titleLabel = (UILabel*)[self.view viewWithTag:1]; 
        CGSize sizeTitle = [self.question.title sizeWithFont:[titleLabel font]
                                           constrainedToSize:CGSizeMake(280.0, INFINITY) 
                                               lineBreakMode:UILineBreakModeWordWrap];
        self.titleLabel.text = self.question.title;
        self.titleLabel.lineBreakMode = UILineBreakModeWordWrap;
        self.titleLabel.frame = CGRectMake(10,10, 260, sizeTitle.height);
    
        CGSize sizeText = [self.question.answer.text sizeWithFont:[self.answerText font]
                                                constrainedToSize:CGSizeMake(280.0, INFINITY) 
                                                    lineBreakMode:UILineBreakModeWordWrap];
        self.answerText.frame = CGRectMake(0,20+sizeTitle.height, 310, sizeText.height+sizeTitle.height);
        [(UIScrollView *)self.view setContentSize:CGSizeMake(280, answerText.frame.size.height +sizeTitle.height)];
        self.view.backgroundColor = bgColor;
        [super viewWillAppear:animated];
    }
    
    - (void)viewDidDisappear:(BOOL)animated {
        NSLog(@"%d", [self retainCount]);
        [super viewDidDisappear:animated];
        [self release];
    }
    
    -(IBAction)goBack:(id)sender{
        [self.navigationController popViewControllerAnimated:YES];
    }
    
    - (void)dealloc {
        NSLog(@"QDC dealoc");
        [self.answerText release];
        [self.titleLabel release];
        [self.question release];
        [super dealloc];
    }
    
    @end
    

    表视图:didselectrowatindexpath:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {   
        QuestionDetailViewController *qdc = [[QuestionDetailViewController alloc] initWithNibName:@"QuestionDetailViewController" bundle:nil];
        Question* question;
        if ([filteredQuestions count]>0) {
            question = [self.filteredQuestions objectAtIndex:indexPath.row];
        } else {
            question = [self.questions objectAtIndex:indexPath.row];
        }
        [qdc setQuestion:question];
        [question release];
        NSLog(@"%d", [qdc retainCount]);
        [self.navigationController pushViewController:qdc animated:YES];
        [qdc release];
    }
    
    2 回复  |  直到 15 年前
        1
  •  1
  •   Dave DeLong    15 年前

    这是:

    - (void)viewDidDisappear:(BOOL)animated {
        NSLog(@"%d", [self retainCount]);
        [super viewDidDisappear:animated];
        [self release];
    }
    

    看起来非常可疑。你做了吗 [self retain] ?如果没有,那你为什么要释放?如果你是,你可能做错了什么,因为 [自我保留] 是一件非常罕见的事情 需要 去做。

        2
  •  1
  •   Johan Kool    15 年前

    而不是:

    [self.answerText release];
    [self.titleLabel release];
    [self.question release];
    

    用途:

    self.answerText = nil;
    self.titleLabel = nil;
    self.question = nil;
    

    或:

    [answerText release]; answerText = nil;
    [titleLabel release]; titleLabel = nil;
    [question release]; question = nil;