Logo der ic engineering & research GmbH
Objective-C Memory Management

Objective-C Memory Management

Folgende Regeln sind einfach zu merken und führen zu einem "sauberen" Memory-Management in Objective-C Code:

Nie dealloc direkt aufrufen - es sollte immer release benutzt werden und damit wird dem System überlassen, wann es die Instanz "entsorgt".

Bei jedem selbstgeschriebenen Objekt ist die Methode dealloc zu überschreiben und alles freizugeben (release), das man selbst erzeugt oder zum "Behalten" (retain) markiert wurde. Am Ende der Methode muss auf jedenfall die dealloc-Methode der Basisklasse aufgerufen werden ([super dealloc]). Hinweis: In Objective-C ist es auch okey, Null-Objekte zu "releasen".

Methoden, bei denen man die Verantwortung zum Freigeben übernimmt:

  • Objekte, die mittels [meineKlasse alloc] instanziert werden
  • Objekte, denen explizit die Mitteilung retain gesendet wird: [meineKlasse retain]
  • Objekte, die mit einer Methode erzeugt werden, die das Wort "copy" enthalten

Bemerkung: you do not own objects created by convenience methods...they are set to autorelease.

Verlust der Verantwortung wird erreicht, indem eine Instanz die einem gehört, wie folgt freigegeben wird:

  • [meineKlasse autorelease] - Damit wird die Instanz später (automatisch) freigegeben
  • [meineKlasse release] - sofortige Freigabe

Wichtig: Die Anzahl der Aufrufe, die einem die Verantwortung übertragen, muss der Anzahl der Aufrufe für die Freigabe der Instanzen übertragen.

Zugriffsmethode auf interne Daten ("set"-Methoden)

Gemäss Empfehlung von Apple sollte eine solche Methode wie folgt aussehen:

- (void) setSomeObject: (NSObject*) aNewObject {
[aNewObject retain];  //#1
[myObject release];   //#2
myObject = aNewObject; //#3
}

#3 setzt die interne Variable auf das neue Objekt

#2 Dieser Aufruf wird getätigt, um ein allenfalls vorhandenes Objekt freizugeben. Dabei wird davon Gebrauch gemacht, dass in Objective-C ohne Konsequenzen auch Methoden von Null-Objekten aufgerufen werden können.

#1 Immer sicherstellen, dass für das übergebene Objekt die Verantwortung für das Speicherhandling übernommen wird

Tip: Sollte eine Variable an einem anderen Ort als in der dealloc-Methode freigegeben werden, ist es gute Praxis diese Variable auf nil zu setzen.

Quelle: http://iphonedevdocs.com/forum/showpost.php?p=932&postcount=4

 

ic engineering & research GmbH
Oberfeldstrasse 120d
CH-8408 Winterthur
Telefon 052 223 13 70