0

tableView:didSelectRowAtIndexPath:アイテムが選択されるたびにViewController-Instanceを作成する場所があります。長時間正常に動作する場合もあれば、EXC_BAD_ACCESS非常に速くクラッシュする場合もあります。デバッガーは[super dealloc];、QuestionDetailViewControllerの行を非難します。

なんで?QuestionDetailViewControllerretainCountをログに記録します。それはうまく見えます。

QuestionDetailViewController

#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

tableView: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];
}
4

2 に答える 2

1

それ以外の:

[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;
于 2010-03-07T19:56:57.470 に答える
1

これ:

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

信じられないほど疑わしいようです。しましたか[self retain]?そうでない場合は、なぜリリースするのですか?もしそうなら、あなたはおそらく何か間違ったことをしているでしょう。なぜなら、それ[self retain]は信じられないほどまれなことだからです。

于 2010-03-07T20:32:47.663 に答える