0

J'utilise GCDAcyncUDPSocket pour recevoir des données. Dans le code ci-dessous, je crée un tuple de (timestamp, data) et l'ajoute dans un autre tableau. Voici mon code:GCDAsyncUdpSocket lors de la réception de données provoque une erreur malloc

- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data fromAddress:(NSData *)address withFilterContext:(id)filterContext 
{ 
dispatch_queue_t bg_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); 
NSString *msg = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; 
NSTimeInterval t = [self getTime]; 
if (msg) 
{ 
    [self.activityQueue.activityQueue enqueue:@"1"]; 
    dispatch_async(bg_queue, ^{ 
     NSData * d = [data copy]; 
      [self addRecvJitter:t withData:d]; 
     d= nil; 
    }); 
} 
} 

- (void)addRecvJitter:(NSTimeInterval)t withData:(NSData *)data 
{ 

NSString * add = [NSString stringWithFormat:@"%f",(t - self.jitterOrigin)]; 
NSArray * addToList = [[NSArray alloc] initWithObjects:add,data, nil]; 
[_rcvdJitter addObject:addToList]; 
} 

J'obtiens l'erreur suivante malloc: * erreur pour objet 0x7a9c2820: double libération * mis un point d'arrêt dans malloc_error_break pour déboguer à cette ligne "[_ rcvdJitter addObject: addToList]; "

Puis-je obtenir de l'aide à ce sujet?

Merci

Répondre

0

Cela ressemble à un problème de filetage. Je suppose que le didReceiveData est appelé sur le thread principal et que vous envoyez le travail sur un autre thread d'arrière-plan.

Avez-vous essayez de supprimer d= nil;

En outre, le msg est en cours de création à l'aide des données reçues juste à vérifier si elle est valide, les données sont copiées et utilisé à nouveau.

Qu'essayez-vous d'accomplir? En ce qui concerne le message d'aide de débogage, vous devez ajouter un point d'arrêt symbolique et définir le type sur malloc_error_break. Vérifiez Vinzzz answer here How to “set a breakpoint in malloc_error_break to debug"