exc_bad_access sur

Je reçois un comportement bizarre de [NSDate timeIntervalSinceReferenceDate] .

J'ai la fonction suivante:

 -(void) insertRow{ NSTimeInterval timeNow = [NSDate timeIntervalSinceReferenceDate]; if (timeNow - secondsSinceTableViewScroll <0.5){ [self insertRow]; return; } NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:[self.itemsToFollow count] - 1]; [self.tableView insertSections:indexSet withRowAnimation:UITableViewRowAnimationAutomatic]; } 

qui est un callback d'une ASIHTTPRequest requestFinished . Si je mets un point d'arrêt dans le code, cela fonctionne très bien. Si j'essaye juste d'exécuter le code, j'obtiens un exc_bad_access sur la ligne:

 NSTimeInterval timeNow = [NSDate timeIntervalSinceReferenceDate]; 

secondsSinceTableViewScroll est un ivar déclaré dans l'en-tête et défini comme ceci:

  secondsSinceTableViewScroll = [NSDate timeIntervalSinceReferenceDate]; 

Des idées pour lesquelles j'obtiens l'exc_bad_access quand il n'y a pas de point d'arrêt?

Merci

La seule chose que j'ai pu find

Je vérifiais l'heure comme ceci:

 -(void) insertRow{ end = [NSDate timeIntervalSinceReferenceDate]; if(end-start < 0.05){ [self insertRow]; return; } NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:[self.itemsToFollow count] - 1]; [self.tableView insertSections:indexSet withRowAnimation:UITableViewRowAnimationAutomatic]; } 

Je suis sûr que quelque part il est dit que vous ne pouvez pas avoir des appels dos à dos de timeIntervalSinceReferenceDate et c'est pourquoi il s'est écrasé (ce genre de boucle récursive était une mauvaise idée de toute façon).

Alors utilisez une boucle while, ou mieux encore une NSTimer.

Merci pour l'aide en tout cas

Changement

 [self insertRow]; 

à

 [self performSelector:@selector(insertRow) withObject:nil afterDelay:0]; 

Votre symptôme suggère que vous êtes en train de planter sur un autre thread. Avez-vous d'autres threads en cours d'exécution? Vérifiez les backtraces pour tous vos threads. Ce qui précède est sur le fil principal, correct?


EDIT: Vous êtes trop rapide et débordant votre stack. Une demi-seconde de "aussi vite que vous pouvez vous appeler" va déborder votre stack très rapidement.