Warum muss ich @synthesize schreiben, wenn ich Getter und Setter bereitstelle?

8

So ist die automatische Synthese von Eigenschaften fantastisch. Wenn Sie jedoch sowohl einen Getter als auch einen Setter bereitstellen, erhalten Sie einen Fehler.

%Vor%

Fehler: Use of undeclared identifier '_testArray' .

Das Hinzufügen von @synthesize testArray = _testArray; löst das Problem. Ich frage mich nur, warum das ist?

    
Kevin Renskers 16.10.2012, 15:38
quelle

3 Antworten

8

Wenn Sie sowohl den Getter als auch den Setter bereitstellen, ist eine Instanzvariable oft einfach nicht erforderlich, d. h. wenn Sie diese Nachrichten einfach weiterleiten oder Daten an anderen Orten speichern.

Sobald einer von ihnen fehlt, wird der ivar benötigt, um diese Funktionalität zu synthetisieren.

Wenn ich mich richtig erinnere, gilt auch für Leseeigenschaften die analoge Annahme.

    
Eiko 16.10.2012, 15:44
quelle
8

Unter dem letzten Compiler / Runtime, wenn Sie

verwenden %Vor%

Der Compiler erstellt

  • a _testArray ivar, wenn es nicht bereits existiert;
  • a testArray Methode, wenn Sie es nicht implementiert haben;
  • Eine setTestArray: -Methode, wenn Sie nicht implementiert haben.

Wenn Sie

verwenden %Vor%

Der Compiler erstellt ein testArray ivar, wenn es nicht bereits existiert, statt _testArray .

Wenn Sie @synthesize nicht verwenden und sich auf die Autosynthese verlassen, wird der _testArray ivar nur erstellt, wenn (beide müssen angewendet werden)

  • _testArray existiert noch nicht;
  • mindestens eine Methode wurde synthetisiert (Getter für readonly , Getter und / oder Setter für readwrite ).

In Ihrem Beispiel haben Sie alle Methoden implementiert, also synthetisiert die Autosynthese keine, also erzeugt sie nicht den ivar. Sie können das _testArray -Ivar entweder selbst deklarieren oder eine explizite Synthese verwenden.

    
Guillaume 16.10.2012 15:56
quelle
-1

Ich habe ein paar Tests gemacht:

Gemäß der aktuellen Objective-c-Konvention müssen Sie keine Eigenschaften synthetisieren.

Wenn Sie das tun

%Vor%

iOs erstellen automatisch eine private Ivar-Variable mit dem Namen _theBiz;

Wenn Sie nur einen Getter oder einen Setter implementieren, scheint es gut zu funktionieren:

%Vor%

Wenn Sie jedoch BOTH deklarieren, erhalten Sie einen Kompilierungsfehler, selbst wenn eine der beiden nur eine leere Funktion ist.

%Vor%

Wenn Sie BEIDE Getter und Setter implementieren, erhalten Sie einen Kompilierungsfehler, der besagt, dass therre kein _theBiz ist.

Das kann leicht durch Hinzufügen von:

behoben werden %Vor%

Aber das besiegt den ganzen Punkt dieser tollen neuen Funktion von Objective-c.

Ich frage mich, ob das von Entwurf ist oder ich gerade etwas vermisse. Was macht Apple-Ding?

Meine beste Vermutung ist, dass es ein Fehler ist.

Guillaumes Antwort geht nicht auf diese Tatsache ein.

Er sagte das

  

mindestens eine Methode wurde synthetisiert

Es scheint, dass _theBiz erstellt worden wäre, wenn only EINER von Getter oder Setter gesetzt ist. Wenn beide festgelegt sind, wird es nicht mehr erstellt und das muss ein Fehler sein. In der Tat muss keiner gesetzt werden und der ivar wird immer noch erstellt.

Die einzige Möglichkeit, das zu beheben, besteht darin,

explizit auszuführen %Vor%     
Anonymous White 19.10.2012 08:59
quelle