2011-03-20 8 views
0

Xcode 4 me dit qu'il se bloque sur cette ligne de code: view.delegate = self;EGOTableViewPullRefresh accident

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.navigationController.navigationBar.barStyle = UIBarStyleBlack; 
    self.title = @"Blog"; 

    if (_refreshHeaderView == nil) { 

     EGORefreshTableHeaderView *view = [[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0.0f, 0.0f - self.tableView.bounds.size.height, self.view.frame.size.width, self.tableView.bounds.size.height)]; 
     view.delegate = self; 
     [self.tableView addSubview:view]; 
     _refreshHeaderView = view; 
     [view release]; 
    } 
    [_refreshHeaderView refreshLastUpdatedDate]; 
} 

Avez-vous une idée pourquoi il se bloque?

Répondre

0

Vous sur-relâchez la vue. Vous initiez view, vous l'affectez ensuite à _refreshHeaderView, puis vous publiez immédiatement view.

Lorsque vous faites ceci:

_refreshHeaderView = view;

... vous dire _refreshHeaderView pour pointer vers l'emplacement de mémoire qui correspond à view. view a un nombre de retenues de 1, car vous l'avez alloué/init'd. Et puis dans la ligne suivante vous libérez view, ce qui signifie que son nombre de retenue est 0, donc l'objet n'existe plus (je simplifie ici: vous l'ajoutez aussi comme une sous-vue, ce qui augmenterait le nombre de retenue. vous n'avez pas besoin de le libérer ici). Cela signifie également que _refreshHeaderView n'existe plus non plus, car à la fois view et _refreshHeadView correspondent au même objet. Donc, quand vous appelez refreshLastUpdatedDate vous aurez un mauvais accès, et un accident. Se débarrasser de [view release] devrait arrêter le plantage, mais vous devriez être très prudent pour vous assurer que vous libérez cet objet plus tard quand vous avez fini avec lui (vraisemblablement dans votre méthode de dealloc). Il serait souhaitable de faire refreshHeaderView une propriété pour aider avec ceci.

+0

pas son crash même quand je supprime la ligne [voir la version] :( – user535351