2010-12-27 14 views
4

Ich versuche, die Speicherverluste in meiner App zu reduzieren, also habe ich Instrumente verwendet, um alle Lecks zu finden. Es gelang mir, fast alle Lecks zu entfernen, außer einem sehr nervigen.Instrumente zeigen NSPlaceholderstring Lecks

Instrumente sagt mir, dass ich eine Menge NSPlaceholderstring Lecks haben. Der Code, der das Leck (nach Instrumenten) erzeugt wird:

if (nil == storedHash) 
{ 
    NSString *description = [[NSString alloc] initWithFormat:@"1 = %@ 2= %d", uId, service]; 
    self.storedHash = description; // This line is the leak according to instruments 

    [description release]; 
    description = nil; 
} 

return storedHash 

storedHash ist wie folgt zu definieren:

@property(copy) NSString* storedHash; 

ich alles versucht, ich denken kann:

  • I verwendet behalten statt kopieren
  • Ich benutzte eine Autorelease-Zuweisung des NSString (stringWithFormat)
  • Ich habe versucht, den Code mit einem Autorelease Pool

Nichts von den oben genannten verändert das Leck. (In einigen Fällen ändert sich die Art der Lecks, aber es gibt immer noch Lecks)

Ideen jemand?

Antwort

0

Wie wäre es in der dealloc Methode? Hast du den storedHash in der Dealloc-Methode freigegeben? Und wie wäre es mit der Überprüfung if (nil == self.storedHash)

+0

'self.storedHash' vs.' storedHash' ist in diesem Fall irrelevant. – bbum

5

Wo geben Sie storedHash frei? Geben Sie es in dealloc frei?

Beachten Sie, dass NSPlaceholdeString ein Implementierungsdetail ist; es ist die Klasse der Instanz, die von der NSString Methode +alloc zurückgegeben wird.

+0

Danke, es war die Dealloc. – Adam

+0

+1 für die Erklärung über 'NSPlaceholderString' – Saphrosit

+0

Wird das Problem gelöst, indem er self.storedHash in Dealloc-Methode freigibt? – Satyam

0

sollten Sie

@property(nonatomic, retain) NSString* storedHash; 

stattdessen kopieren verwenden. @property(copy) entließen alten NSObject nicht und Sie sollten es selbst tun:

if (nil == storedHash) 
{ 
    NSString *description = [[NSString alloc] initWithFormat:@"1 = %@ 2= %d", uId, service]; 
    [self.storedHash release]; 
    self.storedHash = description; // This line is the leak according to instruments 

    [description release]; 
    // description = nil; // it's unnecessary 
} 

auch Sie sollten storedHash in dealloc veröffentlichen.