Wird der Speicher von Objective-c 2.0 Eigenschaften benötigt?

8

Etwas, über das ich mich schon seit einiger Zeit Gedanken gemacht habe. Wenn Sie Eigenschaften verwenden, müssen Sie die Freigabemeldung überschreiben, um sicherzustellen, dass die Eigenschaften freigegebene Eigenschaften sind?

d. ist das folgende (fiktive) Beispiel ausreichend?

%Vor%     
Jacob 07.09.2009, 12:25
quelle

6 Antworten

13

Sie sollten immer die Unterstützungsvariablen in dealloc freigeben:

%Vor%

Ein anderer Weg:

%Vor%

Das ist nicht die bevorzugte Methode, um Objekte freizugeben, aber für den Fall, dass Sie synthetisierte Hintergrundvariablen verwenden , ist dies die einzige Möglichkeit.

HINWEIS: Um zu verdeutlichen, warum dies funktioniert, sehen wir uns die synthetisierte Implementierung des Setter für die link -Eigenschaft an und was passiert, wenn sie auf nil gesetzt ist:

%Vor%

Also der Nettoeffekt ist, dass es den ivar freigibt.

    
Philippe Leybaert 07.09.2009, 12:27
quelle
3

In Nicht-GC Anwendungen, ja. Es ist üblich, Null zu vergeben, anstatt die Ivars freizugeben. Meine beste Erfahrung ist die Freigabe von mit init initialisierten Ivars und die Zuweisung von nil zu Eigenschaften mit Retain- und Copy-Modus.

In deinem Fall würde ich nil

zuweisen %Vor%     
cocoafan 07.09.2009 12:30
quelle
2

Der beste Weg, dies zu tun ist:

%Vor%

Es wäre in der Tat bequemer, die generierten Setter-Methoden zu verwenden

%Vor%

aber das ist verpönt. Sie wissen nicht immer, auf welchen Thread ein Objekt freigegeben wird. Die Verwendung eines Accessors kann daher Probleme verursachen, indem KVO-Benachrichtigungen ausgelöst werden.

Der Haken hier ist, dass Sie Ihre Dealloc-Datei anpassen müssen, damit sie mit der in Ihrer @property definierten Objektverwaltungsrichtlinie übereinstimmt. Z.B. Geh nicht los, um eine iVar zu veröffentlichen, die eine (assign) Eigenschaft unterstützt.

    
Pierre Bernard 07.09.2009 14:22
quelle
1

Nein, Sie überschreiben die Methode -dealloc . Und ja, wenn Sie Ihre Eigenschaften (oder besser gesagt, die Rückseiten-Ivars) nicht freigeben, werden Sie undicht. Also sollten Sie in Ihrer @ Implementierung hier etwas wie

haben %Vor%     
Kevin Ballard 07.09.2009 12:27
quelle
1

Das Synthetisieren einer Eigenschaft erzeugt nur Getter- und Setter-Methoden und gibt daher das Ivar nicht frei, wenn das Objekt freigegeben wird. Sie müssen den ivar selbst freigeben.

    
Tom Dalling 07.09.2009 14:04
quelle
0

In pre-ARC, wann immer Sie new, alloc, retain und copy sehen, ob es sich um eine instance var oder eine property handelt, die Sie freigeben müssen. Wenn Sie eine starke Variable in ARC haben, müssen Sie sie auf Null setzen. In beiden Fällen müssen Sie dealloc () überschreiben.

    
nstein 08.02.2014 09:08
quelle

Tags und Links