Frage

siehe CGPointMake explaination benötigt?

Korrigieren Sie mich, wenn ich falsch bin, bei der Umsetzung von CGPointMake, CGPoint p; eine lokale Variable eines struct erklären, die nach dem Verlassen der Umfang befreit werden sollten sollte. Aber warum kann die Funktion den Wert ohne Risiko zurückkehren?

Wie auch immer, gehen davon aus, dass die Umsetzung von CGPointMake korrekt ist, sollte ich die CGPoint befreien, dass durch CGPointMake erstellt?

War es hilfreich?

Lösung

Es muss nicht befreit werden, weil es nie auf dem Heap lebte. Nur Heap-Speicher zugewiesen Bedürfnisse befreit werden. Speicher, der auf dem Stapel zugeordnet ist (wie in CGPointMake() getan wird) wird automatisch gereinigt werden, nachdem die Methode / Funktion vorhanden ist.

Die Funktion kann einen Punkt zurück, weil der Compiler sieht „Aha, diese Funktion will eine Struktur zurück, die sizeof(CGPoint) Bytes groß ist, so dass ich werde dafür sorgen, dass es genügend Platz im Rückgabewert Speicher-Slot für etwas, dass große .“ Dann, als die Funktion beendet wird, wird der Rückgabewert in dem Rückkehr Speicher Slot kopiert wird, die Funktion beendet und der Wert im Rückschlitz an seinen neuen Bestimmungsort kopiert.

Andere Tipps

Die Funktion kann eine CGPoint zurück, weil die Struktur „klein genug“ ist wieder von einer Funktion direkt werden. Sie Rückkehr keinen Zeiger, bist du das Ganze direkt zurück. Das Gleiche gilt für Methoden, die CGPoints nehmen als parameters-- Sie direkt die ganze Sache nach Wert übergeben können.

Als Dave Notizen, CGPoints sind nicht Objekte, sie sind nur structs. CGPointMake nicht „zuteilen“ Speicher. Es ist nur eine Funktion, dass die Renditen eine Struktur mit den richtigen Größen einrichten, die Sie dann in der Regel Capture in ein lokal auf Ihrem eigenen Stapel oder Pass entlang oder was auch immer.

Wie bei jedem anderen primitiven Typ (int, float oder anderer Struktur), braucht es nicht befreit werden, wenn es Spielraum geht aus.

. (Anmerkung: viele Architekturen / Compiler / „Application Binary Interface“ s haben Optimierungen und Größenbeschränkungen in Bezug auf die Größe eines Dinges als Argument oder Rückgabewert verwendet In diesem Fall könnte ein CGPoint passen tatsächlich vollständig innerhalb eines 64- Bit-Register (2x 32-Bit-Floats), die es nicht mehr Schwergewicht macht als ein int zurück. Aber der Compiler kann auch tun andere Tricks so weit wie das Kopieren in die und aus größeren Strukturen zB CGRect.)

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