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?
Ist es zulässig zu sagen, dass ein Getter der Besitzer der Instanzvariable ist? Oder wem gehört es?
Antwort
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.
Dies ist eine vernünftige Antwort im Allgemeinen, aber sie gilt nicht für Objective-C-Objekte, die Referenzzählung verwenden. –
@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
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.
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
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.
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.
- 1. TableModel vs ColumnModel: Wem gehört der Spaltenwert?
- 2. Was bedeutet es zu sagen, ein Typ ist "boxed"?
- 3. Wem gehört ein NSWindowController in der Standard-Praxis?
- 4. Wem gehört zurückgegebenes BSTR?
- 5. Ist es zulässig, ein constexpr initialiser_list-Objekt zu deklarieren?
- 6. Ist es richtig zu sagen, dass eine ASP .NET MVC-Anwendung ein HTTPModule ist?
- 7. Ist es möglich, Wordpress-Menü zu sperren, so dass nur Besitzer Admin es ändern können?
- 8. iOS - Ist es besser, Getter/Setter-Methoden direkt oder Eigenschaften
- 9. Ist es sinnvoll, nicht-const Referenz Getter
- 10. Ist es zulässig, den Destruktor/Konstruktor der Basisklasse explizit aufzurufen?
- 11. Wem gehört ein Datei-Handle in Windows?
- 12. Wäre es richtig zu sagen, dass JAXB zu XML als Hibernate zu einem Datenbankschema ist?
- 13. Ist es zulässig, positive positive Gesamtquantifizierer nach außen zu heben?
- 14. Was bedeutet es zu sagen, dass "Null ist ein Literal" in JavaScript?
- 15. Was ist der Grund hinter JSLint ist sagen, es „zu viele var Aussagen“
- 16. Ist es zulässig, Bitfelder mit Union zu verwenden?
- 17. Dependency Injection - Wem gehört die Schnittstelle?
- 18. Ist es zulässig, nullptr an std :: string :: assign zu übergeben?
- 19. Was bedeutet es, dass ein Objekt pickbar (oder pickbar) ist?
- 20. Einstellung der Eltern eines Usercontrol verhindert, dass es transparent ist
- 21. Was ist die genaue Definition der Instanzvariable?
- 22. Ist es sicher, ein EJB als Instanzvariable in ein Servlet zu injizieren?
- 23. Ist es zulässig, nach der Benachrichtigung zu verwenden, um Standortaktualisierungen zu verfolgen?
- 24. Können wir sagen, dass ein Router ein Netzwerk ist?
- 25. Ist es gut, dass "alles ein Objekt ist"?
- 26. Ist es zulässig, GraphicsMagick in einer kommerziellen Software zu verwenden?
- 27. block read der Instanzvariable beim Versuch, es zu setzen
- 28. Ist "die optimierte Verzögerung" ein Mythos oder ist es real?
- 29. Ist es zulässig, TR oder TD in der Tabelle ID zuzuordnen?
- 30. Der beste Weg, Swaggerui zu sagen, wo der Host ist
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
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