2012-03-27 15 views
0
Leck in meiner TaggingScreen.m init Funktion

zu entfernen, das tue ich -iOS - nicht in der Lage Speicher

tags = [myTagMgr getMyTags]; 

In meiner getMyTags Methode, mache ich die folgenden -

NSMutableDictionary *myTags = [NSMutableDictionary new]; 
.... 
return myTags; 

ich ein Speicherleck für meineTags in dieser Methode. Wo sollte ich die Erinnerung freigeben? "Tags" ist eine Eigenschaft, die in der gesamten TaggingScreen-Klasse verwendet wird. Wenn ich also eine Autorelease mache, bekomme ich eine Ausnahme, die besagt, dass eine Nachricht an eine freigegebene Instanz gesendet wird, wenn ich versuche, auf Tags in anderen Methoden der Klasse zuzugreifen.

EDIT:

- (NSMutableDictionary *)getMyTags 
{ 

NSMutableDictionary *myTags=[NSMutableDictionary new]; 
NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init]autorelease]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Tag" 
           inManagedObjectContext:localObjectContext]; 
[fetchRequest setEntity:entity]; 

NSError *error = nil; 
NSArray *fetchedArrayObjects = [localObjectContext executeFetchRequest:fetchRequest error:&error]; 

if (fetchedArrayObjects ==nil) { 
    return nil; 
} 
if ([fetchedArrayObjects count]==0) { 
    return nil; 
} 

Tag *aMessage; 
for (int i=0; i<[fetchedArrayObjects count];i++) 
{ 
    aMessage= (Tag *)[fetchedArrayObjects objectAtIndex:(NSUInteger)i]; 

    [myTags setValue:[aMessage isSet] forKey:[aMessage tagName]]; 
    } 
return myTags; 
} 
+0

Welche Art von '@ Eigenschaft' ist 'Tags' ?? – yuji

+0

seine a @property (nicht atomare, zuweisen) NSMutableDictionary * -Tags; – Suchi

Antwort

1

Vignesh und Vin Lösungen sind richtig, aber auf das, was Sie gesagt haben, das Beste, was zu tun wäre, tags in eine strong Eigenschaft zu ändern:

@property (nonatomic, strong) NSMutableDictionary *tags; 

Es sei denn, Sie in einer Situation sind, wo Eine Retain-Schleife könnte entstehen (zB ein Delegate-Objekt), Sie sollten strong verwenden, damit Ihre Eigenschaften nicht von Ihnen freigegeben werden.

Darüber hinaus, es sei denn Sie ARC verwenden, möchten Sie myTags zu Autorelease:

return [myTags autorelease]; 

Ach ja, und wenn Sie nicht ARC verwenden, werden Sie wollen sicherstellen, tags freizugeben in dealloc.

+0

Sorry, vielleicht liege ich falsch, aber wenn Sie ARC verwenden, können Sie keine Autorelease aufrufen. –

+0

Sie haben Recht, und ich werde das erwähnen.Aber wenn das OP ARC verwendet, ignorieren sie eine Warnung über das Zuweisen einer schwachen Eigenschaft. – yuji

+0

Kein Problem, yuji. –

0

Versuch:

return [myTags autorelease]; 
0

Sie sollten autorelease in dem Verfahren. Wenn Sie es brauchen, müssen Sie retain es, wo Sie es nennen.

tags = [[myTagMgr getMyTags] retain]; 
1

, wenn Sie es in init Methode tun können Sie folgendes tun:

tags = [[myTagMgr getMyTags] retain]; 

statt in Ihrem getMyTags Methode

return [myTags autorelease]; 

Auf diese Weise haben Sie +1 für Ihren NSDictionary und Sie können darauf mit self.tags in Ihrem Controller zugreifen.

wo

@property (nonatomic, retain) NSDictionary* tags; 

Denken Sie daran, es zu lösen in dealloc

- (void)dealloc 
{ 
    [tags release]; tags = nil; 
    [super dealloc]; 
} 

P. S. Ich gehe davon aus, dass Sie ARC nicht verwenden.