ObjC-Memory Management: Difference between revisions

From Medien Wiki
Line 2: Line 2:


Das Memory-Management von Cocoa basiert auf einem Retain-Count Mechanismus. Anders als z.B. bei C (malloc & free), gibt es in Objective-C eine klar geregelte Verantwortung für den Lebenszyklus des Objektes:  
Das Memory-Management von Cocoa basiert auf einem Retain-Count Mechanismus. Anders als z.B. bei C (malloc & free), gibt es in Objective-C eine klar geregelte Verantwortung für den Lebenszyklus des Objektes:  
* ''Ownership''
 
** Wer das Objekt erstellt (also mit <tt>alloc</tt> Speicher dafür reserviert) =&gt;
''Ownership''
** ist der ''"Creator"'' und muss die Verantwortung für die Speicherfreigabe übernehmen (also mit <tt>release</tt> den Speicher wieder freigeben).
* Wer das Objekt erstellt (also mit <tt>alloc</tt> Speicher dafür reserviert) =&gt;
* ist der ''"Creator"'' und muss die Verantwortung für die Speicherfreigabe übernehmen (also mit <tt>release</tt> den Speicher wieder freigeben).


Jedes Objekt hat einen sog. retain count, der normalerweise bei der Erstellung des Objektes (z.B. mit alloc oder copy) einen Wert von 1 hat. Wenn nun dieses Objekt von einem anderen Objekt als seinem Eigentümer für längere Berechnungen oder als eigene Instanz-Variable benötigt wird, so kann man [obj retain] aufrufen. Damit steigt der retain-count dieses Objektes um 1 auf 2. Das Objekt wird gelöscht (bzw. der [obj dealloc] aufgerufen), wenn der retain-count auf 0 zurück geht.
Jedes Objekt hat einen sog. retain count, der normalerweise bei der Erstellung des Objektes (z.B. mit alloc oder copy) einen Wert von 1 hat. Wenn nun dieses Objekt von einem anderen Objekt als seinem Eigentümer für längere Berechnungen oder als eigene Instanz-Variable benötigt wird, so kann man [obj retain] aufrufen. Damit steigt der retain-count dieses Objektes um 1 auf 2. Das Objekt wird gelöscht (bzw. der [obj dealloc] aufgerufen), wenn der retain-count auf 0 zurück geht.
Line 11: Line 12:
Der Programmierer muss dafür sorgen, dass seine retain/release bzw. alloc/release bzw. copy/release Aufrufe ausgeglichen sind. Ansonsten kommt es zu Leaks (Zombie-Objekte) oder zu einem Crash, wenn ein Objekt per release freigegeben wird, das es nicht mehr gibt.
Der Programmierer muss dafür sorgen, dass seine retain/release bzw. alloc/release bzw. copy/release Aufrufe ausgeglichen sind. Ansonsten kommt es zu Leaks (Zombie-Objekte) oder zu einem Crash, wenn ein Objekt per release freigegeben wird, das es nicht mehr gibt.


z.B. erfordern folgende Aufrufe einen späteren release
Folgende Aufrufe erfordern einen späteren release
* alloc
* alloc (owner)
* copy
* copy (owner)
* new (owner, selten)
* retain
* retain