Memory Management mal wieder

Posted by admin | Development,iPhone,Objective-C | Friday 24 April 2009 20:34

Das iPhone führt aus Energiespargründen keinen Garbage Collector aus. Da auch ich immer wieder das Memory Management in Objective-C nachschlagen muß hier eine Zusammenfassung.

Wenn man ein Objekt erzeugt muss man dessen Speicherplatz auch wieder freigeben wenn man kein Speicherleck haben möchte. Generell kann man sagen, daß man für die Freigabe des Speichers verantwortlich ist wenn man diesen auch reserviert hat. Dies geschieht entweder über die alloc oder eine copy Methode:

MyObject *obj1 = [[MyObject alloc] init];
MyObject *obj2 = [obj1 copy];

Die Freigabe erfolgt über die in NSObject definierte Methode release:

[obj1 release];

Für die Freigabe des Speichers von Objekten die über Factory Methoden erzeugt wurden ist die Klasse verantwortlich. Solchen Objekten wurde vor der Rückgabe die autorelease Message gesendet. Zum Beispiel:

return [object autorelease];

Der im Mainthread automatisch vorhandene NSAutoreleasePool überwacht nun dieses Objekt und gibt dessen Speicher frei wenn die Programmausführung am Ende des Scope also dem Ende der Methode die das Objekt angefordert hat angekommen ist.
Wenn man nun dieses Objekt für eine spätere Bearbeitung behalten möchte muss man ihm die retain Message senden:

[object retain];

Nun gibt der NSAutoreleasePool das Objekt nicht frei. Man ist nun selber für dieses Objekt verantwortlich und muss ihm später die release Nachricht senden wenn man es nicht mehr benötigt.

Damit sind wir am Ende der kurzen Auffrischung zum Thema Memory Management mit Objective-C auf dem iPhone.

Wie man einen NSAutoreleasePool erzeugt habe ich hier bereits einmal beschrieben: http://cgstudio.de/2009/04/20/nsobject-background-thread-memory-leaks/

Share/Save/Bookmark

No Comments »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment