2009-04-29 5 views
-1

Eigentlich würde ich sagen: Ja, der Getter ist der Besitzer. So ist jeder, der den Getter anruft, nicht dafür verantwortlich, den Speicher freizugeben. Genauer gesagt ist das Objekt selbst der Eigentümer, aber der Getter fungiert als Übermittlungsmechanismus der Instanzvariablen für andere. Ist das richtig, oder habe ich das falsch verstanden?Ist es zulässig zu sagen, dass ein Getter der Besitzer der Instanzvariable ist? Oder wem gehört es?

+0

Eigentum bedeutet, dafür verantwortlich zu sein, die Zuordnung aufzuheben, wenn sie nicht mehr benötigt wird. Dies geschieht normalerweise in der Klasse dealloc() und nicht im Getter. Ich denke, Sie haben eine andere Definition von Eigentum. Könntest Du das erläutern? – thesamet

+0

Wenn Sie Fragen wie diese stellen, sollten Sie es im Text der Frage, die Sie zu Cocoa stellen, sehr deutlich machen, oder Sie werden viele irreführende Antworten (wie die hier) bekommen, die sich auf nicht aufgezählte Sprachen beziehen. – smorgan

Antwort

0

Im Wesentlichen sind Sie richtig, aber es ist nur eine Frage der Konvention. Solange Ihre Konvention konsequent angewendet wird und alle, die an dem Projekt arbeiten, dem zustimmen, dann sind Sie golden.

Wo Probleme auftreten können, ist, wenn ein Aufrufer einen Zeiger auf einen Speicher zwischenspeichert, der von einem Zugriffsmechanismus abgerufen wird, und dann wird das Objekt zerstört, und jetzt hängt der Zeiger.

+1

Dies ist eine vernünftige Antwort im Allgemeinen, aber sie gilt nicht für Objective-C-Objekte, die Referenzzählung verwenden. –

+0

@Jens Alfke, eine kleine Korrektur, Foundation-Objekte verwenden Referenzzählung, nicht alle Objective-C-Objekte. Das von der Basic-Laufzeit implementierte Objective-C-Objekt bietet nichts dergleichen. Es ist nur Ivar ist die Isa. – dreamlax

0

Kommt drauf an.

Sie sollten sich für Objektbesitzrichtlinien entscheiden. Aber im Allgemeinen, wenn ein Objekt ein Unterobjekt (ein Mitglied) eines anderen ist, ist das Objekt, für das es ein Teil ist, für seine Lebensdauer verantwortlich und (im Allgemeinen) bereinigt es seinen Destruktor.

Das Verteilen von Speicher, der vom Anrufer aufgeräumt werden soll, ist im Allgemeinen verpönt. In C geben Bibliotheken, die Speicher für Aufrufer reservieren müssen (z. B. X Windows-Bibliotheken oder eine C-API für einen Datenbank-Client), einen undurchsichtigen Zeiger aus, der vom Aufrufer durch Aufrufen einer anderen Bibliotheksfunktion gelöscht werden muss:

Window foo = APIcreateWindow(); 
APIsetupWindow(foo, x, y, z); 
AOIshowWindow(foo); 
APIdestroyWindow(foo); //forgetting to call this leaks memory 

In diesem (hypothetischen) Code ist Window eigentlich ein typedef für einen Zeiger auf struct; APICreateWindow allokierten Speicher für die Struktur, APIdestroyWindow ruft darauf auf, nachdem andere API-Buchführung durchgeführt wurde.

In C++ würden wir wahrscheinlich einen intelligenten Zeiger zurückgeben, der sich selbst zerstört, wenn sich nichts anderes darauf bezieht.

+0

Kakao ist ganz anders. Moderne Objective-C-Laufzeiten haben eine Speicherbereinigung, aber ältere oder weniger ausgefeilte Laufzeiten verwenden im Allgemeinen eine Referenzzählung. Die Rückgabe eines beibehaltenen Objekts aus einer Methode ist normalerweise nicht erforderlich, da der Aufrufer es selbst behalten kann. Normalerweise sind die einzigen Methoden, die beibehaltene Objekte zurückgeben, Methoden, die sie zuweisen. Für Methoden, die Speicherplatz zuweisen, gibt es die Methode -autorelease, die zum Hinzufügen eines Objekts zu einem Autorelease-Pool verwendet werden kann. Die Lebensdauer des Objekts ist für die Lebensdauer der Methode des Aufrufers garantiert, kann jedoch bei Bedarf manuell beibehalten werden. – dreamlax

1

Da Sie nach Cocoa fragen, die ein Referenzzählsystem verwendet, gibt es keinen "Besitzer". Jeder, der eine Referenz besitzt, ist ein Teileigentümer und verantwortlich für die Freigabe seiner Referenz. Wenn die letzte Referenz freigegeben wird, wird das Objekt freigegeben.

Es ist der Fall, dass die Konventionsmethoden den Aufrufer nicht standardmäßig beibehalten, aber das bedeutet nicht, dass ein Aufrufer nicht explizit ein Objekt beibehalten konnte.

5

Es macht mehr Sinn, über Objekte zu sprechen, keine Methoden, Objekte zu besitzen.

Oft ist es die Aufgabe, dass der Getter aufgerufen wird, ist der Eigentümer des Gegenstandes zurückgeführt wird, weil der Rückgabewert eine Instanzvariable ist:

  • (Foo *) foo { return _foo; // meine Instanzvariable }

Allerdings ist es auch üblich, dass ein Getter ein temporäres Objekt zu erstellen, die Autoreleased worden ist, und schicken Sie es:

  • (NSString *) sizeStr { return [NSString stringWithFormat: @ "% d", selbst.Größe]; }

In diesem Fall, dass das Objekt (die NSString) nicht wirklich einen Eigentümer, außer vielleicht den aktuellen Autofreigabepool, die es freigeben, wenn es austritt. Die wichtigen Regeln, die man bei der Cocoa-Programmierung (nicht GC) beachten sollte, haben nicht mit dem Besitz an sich zu tun, sondern mit einem Verweis auf ein Objekt (das man irgendwann freigeben muss).

und wenn du es nicht tust.

Verwandte Themen