Frage

Wenn Sie ein Objekt in Objective-C freisetzen (unter der Annahme seiner Freigabezählung 1) seiner Veröffentlichung wieder auf 0 und die dealloc Methode aufgerufen verringert. Ist das Objekt genau dort zerstört und dann nach dem [super dealloc], oder ist es in den Pool aufgenommen und zerstört, wenn der Pool leer ist?

Ich würde davon ausgehen, dass die Freigabe Objekte am Ende des dealloc zerstört werden (wenn [super dealloc] genannt wird) Ich weiß, Autorelease Variablen zum Pool hinzugefügt wird, nur um sicher sein wollte, was normal freigegeben Objekte geschieht.

prost -gary -

War es hilfreich?

Lösung

Zunächst einmal, Objective-C des Programmiersprache haben kein Konzept der Speicherverwaltung. Die Speicherverwaltung wird in Stiftung gebaut (der gemeinsame Rahmen von Cocoa für Mac OS X und Cocoa Touch auf dem iPhone O) . Stiftung fügt eine rootclass NSObject, die alloc, retain, release und autorelease als Convenience-Wrapper auf den class_createInstance() und object_dispose() Funktionen aus der Objective-C-Laufzeit implementiert.

Da Objective-C ist die Speicherverwaltung Agnostiker, Garbage Collection Hinzufügen und machen alle Speichermanagementmethoden auf NSObject no-ops war ganz einfach. Aber es gibt keine Garbage Collection auf dem iPhone OS und Legacy Mac OS X und dort stattdessen wir eine Referenzzählung Schema in Cocoa verwenden.

Ein Objekt wird erstellt, wenn die alloc Klassenmethode auf NSObject oder NSProxy von Foundation aufrufen. Diese Standardimplementierungen werden class_createInstance() rufen, so dass Sie nie manuell müssen.

Ein Objekt „stirbt“, wenn dealloc auf der Root-Klasse NSObject ausgeführt wird. Dies ist, wenn der Speicher für das Objekt auf dem Heap durch den Aufruf object_dispose() freigegeben wird, werden Sie nie, so lange diese Funktion selbst aufrufen müssen, wie Sie von NSObject oder NSProxy von Stiftung erben.

Autoreleased Objekte eines besonderen nicht behandelt werden, soweit die Laufzeit betrifft, ein Autoreleased Objekt ist nur so lebendig wie jedes anderes Objekt. Was passiert, wenn Sie ein Objekt autorelease ungefähr;

-(id)autorelease; {
  [NSAutoreleasePool addObject:self];  // retain count +1
  [self release];                      // retain count -1
  return self;
}

autorelease Aufruf wird die Beibehaltungszähler nicht verringern, es wird nur das Eigentum an dem Objekt von dem Anrufer zu dem aktuellen Autofreigabepool. Später, wenn der aktuelle Autofreigabepool weggeht, wird es release auf allen Objekten nennt es besitzt, und jedes Objekt nicht von irgendetwas im Besitz länger sonst freigegeben wird.

Andere Tipps

Ja, sie werden, sobald der Retain-Count trifft Null ausgeplant.

Das Autofreigabesystem für Objekte, die das Eigentum ein wenig „mehrdeutig“ ist - das heißt, wenn Sie ein neues Objekt sind Rückkehr, die Sie nicht wollen, besitzen, deren Lebenszeit unbekannt ist, und Sie nicht wollen, die davon ausgehen, Anrufer übernehmen die Verantwortung für. Wenn der Autofreigabepool leer ist (in der Regel beim nächsten Mal um die Laufschleife) sind alle Mitglieder Mitteilung gesendet. Wenn der Anrufer, die Ihr Objekt empfangen will dafür Verantwortung zu übernehmen, alles was man tun muss ist es behalten, und dies wird seine Freigabe vermeiden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top