2010-11-30 9 views
0

Ich habe einen Speicherverlust in dem folgenden Szenario. Ich lese Daten alle 30 Sekunden mit SBJSONParser es in ein Wörterbuch zu verwandeln, eine Benachrichtigung hinzufügen und nach die Daten verwenden, um es zu einem Tableview zu binden:AsyncSocket und Benachrichtigungen - Speicherverlust

// 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]; 
} 

Auf einem CustomViewController Ich habe den Beobachter:

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

und die BindData Methode:

-(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]; 
} 

das Problem ist: wenn ich company.name = etwas von diesem Wörterbuch gesetzt, bekomme ich ein Speicherleck auf der Linie: NSMutableDicti onary * dict = [[NSMutableDictionary alloc] initWithDictionary: [Inhalt JSONValue]]; Das erhöht sich seit ich alle 30 Sekunden lese.

Ich schätze jede Hilfe, die Sie geben können. Vielen Dank.

Antwort

0

dict ist undicht, weil Sie alloc und verwenden (wodurch die Retain-Zählung um 1 erhöht wird), aber niemals freigegeben. Da das Wörterbuch nicht mehr benötigt wird, nachdem die Meldung bekannt gegeben worden ist, können Sie sicher auf der folgenden Zeile freigeben, etwa so:

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

die Memory Management Programming Guide Details für mehr sehen.

+0

Danke für Ihren Kommentar. Ich habe das Diktat in meinem Code freigegeben, ich habe nur vergessen, es in der ersten Nachricht hinzuzufügen, ich bearbeite es einfach, so dass das Problem immer noch besteht, auch wenn ich dict freigeben. – mit

+0

Wenn das der Fall ist, dann gibt es kein Leck in dem Code, den Sie gepostet haben. Es ist möglich, dass es in einem Teil davon sein könnte, der oben nicht enthalten war. –