In Arc was passiert, wenn Sie nicht synthetisieren

8

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?

    
1dayitwillmake 08.11.2012, 21:08
quelle

5 Antworten

16

Eine Reihe von Beobachtungen, von denen ein Großteil wahrscheinlich auf der Grundlage der Rückmeldungen von anderen klar ist:

  1. Sie synthetisieren Eigenschaften, keine Instanzvariablen, und in Ihrem Beispiel haben Sie uns ein Beispiel für eine Instanzvariable gezeigt, keine Eigenschaft.

  2. 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.

  3. 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.

  4. 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 .

  5. 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.

  6. 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.

  7. 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.

  8. 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.

Rob 09.11.2012, 09:04
quelle
3

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.

    
WDUK 08.11.2012 21:13
quelle
2

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.

    
rmaddy 08.11.2012 21:13
quelle
0

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.

    
Metabble 08.11.2012 21:17
quelle
0

mit der neuen Laufzeit brauchen Sie nur @properties btw - deklarieren Sie nicht ivars, synthetisieren Sie nicht

    
Daij-Djan 08.11.2012 21:31
quelle