2010-11-30 31 views
0

J'ai une fuite de mémoire dans le scénario suivant. Je lis des données à toutes les 30 secondes, utilisez SBJSONParser pour le transformer en un dictionnaire, ajouter une notification et après utiliser les données pour le lier à un tableview:AsyncSocket et notifications - fuite de mémoire

// Read data and send notification 
-(void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag 
{ 
    NSString *content = [[NSString alloc] initWithData:[data subDataWithRange:NSMakeRange(0, [data length] - 2)] encoding: NSUTF8StringEncoding]; 

    // Line where leaks appear 
    NSMutableDictionary* dict = [[NSMutableDictionary alloc] initWithDictionary:[content JSONValue]]; 

    [content release]; 

    // Post notification 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"BindData" object:nil userInfo:dict]; 

    [dict release]; 
} 

Sur un CustomViewController je l'observateur:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(bindData) name:@"BindData" object:nil]; 

et la méthode BindData:

-(void)bindData:(NSNotification*)notification 
{ 
    NSAutoreleasePool* pool = [[NSAutoReleasePool alloc] init]; 

    NSMutableArray* customers = [notification.userInfo objectForKey:@"Customers"]; 
    for (NSDictionary* customer in customers) 
    { 
     Company* company = [[Company alloc] init]; 
     company.name = [customer objectForKey:@"CompanyName"]; 
     NSLog(@"Company name = %@", company.name); 
     [company release]; 
    } 

    [pool drain]; 
} 

le problème est le suivant: quand je mets company.name = quelque chose de ce dictionnaire, je reçois une fuite de mémoire sur la ligne: NSMutableDicti onary * dict = [[NSMutableDictionary alloc] initWithDictionary: [contenu JSONValue]]; qui ne cesse d'augmenter depuis que je lis toutes les 30 secondes.

J'apprécie toute aide que vous pouvez donner. Merci.

Répondre

0

dict fuit parce que vous utilisez alloc et init (augmentant ainsi son nombre de retenue de 1), mais ne le relâchant jamais. Étant donné que le dictionnaire ne sera plus nécessaire après la notification a été affichée, vous pouvez en toute sécurité le sortir sur la ligne suivante, comme ceci:

// Post notification 
[[NSNotificationCenter defaultCenter] postNotificationName:@"BindData" object:nil userInfo:dict] 
[dict release]; 

Voir la Memory Management Programming Guide pour plus de détails.

+0

Merci pour votre commentaire. Je libère la dict dans mon code, j'ai juste oublié de l'ajouter dans le message initial, je l'édite juste, donc le problème est toujours là même si je relâche dict. – mit

+0

Si c'est le cas, il n'y a pas de fuite dans le code que vous avez posté. Il est possible que ce soit dans une partie de ce qui n'était pas inclus ci-dessus. –