Was passiert, wenn ich in einem iOS ARC-fähigen Projekt keine Eigenschaft synthetisiere, da Retain / Release nicht erlaubt sind?
%Vor% Was ist die Speichersemantik der iVar _pieces in diesem Fall?
Sagen wir es mit _pieces = whatever
.
Ist _pieces auf null gesetzt, wenn die Instanz meiner SomeClass freigegeben wird? Werden Stücke als schwache Referenz gespeichert? Wenn alle anderen Objekte, die _pieces beibehalten haben, es freigeben, wird es null sein, wenn ich versuche, darauf zuzugreifen?
Eine Reihe von Beobachtungen, von denen ein Großteil wahrscheinlich auf der Grundlage der Rückmeldungen von anderen klar ist:
Sie synthetisieren Eigenschaften, keine Instanzvariablen, und in Ihrem Beispiel haben Sie uns ein Beispiel für eine Instanzvariable gezeigt, keine Eigenschaft.
Ihre Frage könnte eine vermutete Verbindung zwischen dem Synthetisieren und der Möglichkeit, retain
/ release
auszuführen, beinhalten, aber es gibt keine solche Verbindung. Die Möglichkeit, retain
und release
auszuführen, hängt davon ab, ob Sie ARC oder nicht. Es hat nichts mit der Synthese von Eigenschaften zu tun.
Wie andere bereits festgestellt haben, sind explizit deklarierte Instanzvariablen, wie z. B. Ihr Beispiel, standardmäßig strong
referenzen. In Ihrem Beispiel ist _pieces
also strong
referenz.
Ja, wenn Ihr SomeClass
-Objekt freigegeben wird, wird der Verweis strong
auf das Objekt _pieces
entfernt. Wenn dies der letzte starke Verweis auf das Objekt ist, auf das _pieces
zeigt, wird es natürlich freigegeben und alle anderen weak
Referenzen, die Sie an anderer Stelle haben, werden auf nil
gesetzt. Weitere Informationen zur Speicherverwaltung finden Sie in Apples Advanced Memory Management Programmierhandbuch und Übergang zu ARC .
Sie haben gefragt: "Wenn alle anderen Objekte, die _pieces
beibehalten haben, es freigeben, wird es nil
sein, wenn ich versuche, darauf zuzugreifen?" Offensichtlich wäre das wahr, wenn _pieces
eine weak
Referenz wäre, aber da es implizit eine strong
Referenz in SomeClass
ist, nein, das ist nicht der Fall.
Wenn Sie pieces
ein erstellen möchten deklarierte Eigenschaft , die Syntax wäre
@property (nonatomic, strong) NSMutableArray* pieces;
Die Bezeichnung von strong
vs. weak
(oder was auch immer) diktiert die Speicherverwaltung der Eigenschaft.
Wenn Sie eine Eigenschaft deklarieren, müssen Sie die Instanzvariable nicht nur nicht mehr explizit definieren, sondern es wird Ihnen jetzt empfohlen, dies nicht zu tun (da der Compiler bei der Synthese den ivar erstellt) für dich). Wenn Sie jedoch eine explizit deklarierte Instanzvariable mit dem richtigen Namen für Ihre Eigenschaft haben, verwendet der Compiler diese für die Eigenschaft. Aber das ist nicht nur unnötig, sondern auch nicht ratsam (denn wenn Sie den Namen der Instanzvariablen falsch eingeben, können Sie unbeabsichtigt zwei Instanzvariablen erhalten). Lassen Sie den Compiler Ihre Instanzvariablen für Ihre Eigenschaften synthetisieren und diese mögliche Ambiguität verschwindet.
Der Name der Instanzvariable, die für eine Eigenschaft synthetisiert wird, richtet sich nach der Syntax von Eigenschaftsimplementierungsrichtlinie , dh die @synthesize
-Anweisung. Wenn Sie also eine @synthesize
-Anweisung für Ihre pieces
-Eigenschaft des Formulars haben:
@synthesize pieces;
dann wird die Instanzvariable pieces
heißen. Aber wenn Sie die bevorzugte @synthesize
-Syntax von: verwenden, dann wird der Name der Instanzvariablen den vorhergehenden Unterstrich haben (was per Konvention bevorzugt ist, um Mehrdeutigkeiten zu vermeiden) Ihr Code zwischen Eigenschaften und Instanzvariablen). Und ab Xcode 4.4, wenn Sie die @synthesize pieces = _pieces;
-Anweisung für eine @synthesize
weglassen, wird sie implizit für Sie mit der letzteren Syntax synthetisiert, dh die Instanzvariable wird den führenden Unterstrich tragen.
Wenn Sie davon ausgehen, dass Sie keine Eigenschaft erstellt haben, die diese Option verwendet, die das angenommene Verhalten außer Kraft setzt, werden Instanzvariablen in ARC-Projekten als stark angenommen, sodass die Deklaration wirklich
lautet %Vor%Also, als Antwort auf Ihre Fragen
Ist _pieces auf null gesetzt, wenn die Instanz meiner SomeClass freigegeben wird?
Nein, aber das Zuweisen einer Instanz führt nicht zur Aufhebung der Zuordnung.
Werden _Stücke als schwache Referenz gespeichert?
Nein, es ist eine starke Referenz.
Wenn alle anderen Objekte, die _pieces beibehalten haben, diese freigeben, wird es null sein, wenn ich versuche, darauf zuzugreifen?
Nein, das ist die gleiche Frage wie Ihre erste.
Deklarieren Sie eine Eigenschaft mit dem Namen pieces
oder handelt es sich um einen direkten Ivar?
Wenn Sie eine Eigenschaft definieren, hängt die Speichernutzung davon ab, wie Sie die Eigenschaft definieren.
Wenn es sich um einen geraden ivar handelt, ist der ivar standardmäßig strong
. Dies bedeutet im Wesentlichen, dass der Ivar das Objekt, das Sie ihm zuweisen, ordnungsgemäß behält und freigibt. Sie können es ohne Bedenken verwenden.
Nach meinem besten Wissen behandelt ARC es so, wie Sie es in ähnlicher Weise wie strong
behandeln würden. Wenn Sie es zuweisen, wird der eingehende Wert retain
ed und der Wert, auf den nicht mehr verwiesen wird, ist release
d. Es wird nur baumeln, wenn es irgendwie frei wird. Wenn Sie eine Eigenschaftsdeklaration haben, wird ARC die dort angegebenen Regeln einhalten, und die Accessoren werden automatisch für Sie in der Form @synthesize someObject = _someObject
synthetisiert. Wenn das Objekt freigegeben wird, nehme ich an, dass das Objekt release
gesendet wird, so dass, wenn nichts anderes Inhaberschaft behauptet hat, das Objekt, auf das der Zeiger zeigt, ebenfalls freigegeben wird.
Tags und Links objective-c ios automatic-ref-counting