Objective-C wechselt zwischen OS 2.2.1 und OS 3?

7

Als ich versucht habe, meine App für OS 3 zu kompilieren, ist folgender Fehler aufgetreten:

Fehler: Typ des Accessors stimmt nicht mit dem Typ der Eigenschaft

überein

Der Fehler war für eine Eigenschaft, auf die ich zuzugreifen versuchte, die wie folgt definiert ist:

%Vor%

Die Eigenschaft is @synthesized in der Implementierungsdatei.

Dies funktionierte in OS 2.2.1 gut, ist aber nicht OS 3.0

Das Schreiben der Getter-Methode selbst hat das Problem gelöst.

Kennt jemand Änderungen an objective-c zwischen OS 2.2.1 und 3.0? Gibt es Dokumentation für diese Änderungen?

Das API-Änderungsdokument scheint nichts zu diesem Problem zu enthalten.

BEARBEITEN

Der Fehler tritt auf, wenn Sie versuchen, auf die Eigenschaft zuzugreifen, z.

%Vor%

Wie ich oben erwähnt habe, habe ich einen Workaround gefunden: Ich schreibe die Getter-Methode selbst, aber was ich wirklich will, ist eine Dokumentation von Apple, die diese Änderung und alle anderen Änderungen erklärt, die nicht API-bezogen sind.

>

Danke für Ihre Hilfe

    
Ron Srebro 19.06.2009, 18:21
quelle

6 Antworten

17

Dies ist ein Compilerfehler.

Obwohl Sie es nicht vollständig angegeben haben, erwarte ich, dass Ihr Code wie folgt aussieht:

%Vor%

Der Compiler ist leider zwischen der Deklaration der objects Eigenschaft und der Deklaration der objects Instanzvariablen verwirrt. Denken Sie daran, dass Eigenschaften und Instanzvariablen in Objective-C verschiedene Dinge sind; Eine Eigenschaft kann von einer Instanzvariable unterstützt werden, sie ist jedoch ein Teil der öffentlichen Schnittstelle einer Klasse.

Sie können dies umgehen, indem Sie Ihren Code ändern, um die Definition der Instanzvariablen klar von der Definition der Eigenschaft zu trennen, indem Sie beispielsweise den Namen der Instanzvariablen voranstellen:

%Vor%

Auf diese Weise wird der Compiler nicht verwirrt über die Eigenschaft im Vergleich zur Instanzvariable in Ausdrücken wie self.objects (was er ohnehin nicht tun sollte, aber anscheinend tut).

Nur um die unvermeidliche Antwort abzuwenden: Apple nicht behält das Unterstrich-Präfix für Instanzvariablen. Es ist für Methoden reserviert. Unabhängig davon, ob Sie die Unterleiste nicht mögen, können Sie ein anderes Präfix verwenden.

    
Chris Hanson 23.06.2009, 08:28
quelle
5

edit: Die ursprüngliche Antwort wurde entfernt, nachdem die Peer-Review-Lösung fehlte. Bitte lesen Sie Chris Hansons Kommentare zu diesem Thema. Ich lasse den Rest hier, weil ich denke, dass es immer noch gültig ist.

Beachten Sie, dass selbst wenn Sie den Eigenschaftstyp als NSArray deklarieren, das zurückgegebene Objekt immer noch ein NSMutableArray ist und die änderbaren Methoden für definiert sind. Wenn die Eigenschaft auf diese Weise deklariert wird, verhindert not , dass jemand versehentlich das Array mutiert.

Wenn Sie sicherstellen möchten, dass das zurückgegebene Array nicht veränderbar ist, können Sie die Eigenschaft wie in Ihrem ursprünglichen Beispiel deklarieren und dann Ihren eigenen Accessor rollen:

%Vor%

Beachten Sie, dass dies eine nicht abgerufene NSArray zurückgeben würde. Es wäre Sache des Aufrufers, das Objekt zu übernehmen, wenn es persistieren müsste.

    
e.James 19.06.2009 18:51
quelle
4

Sie sehen Fehler, weil XCode jetzt Warnungen und Fehler für Dinge ausgibt, die es vorher nicht getan hat ...

Ich würde argumentieren, dass es höchstens eine Warnung sein sollte, um das zu tun, was Sie tun, ich verstehe Ihren Versuch, das Array als unveränderlich für die Außenwelt zu präsentieren, aber es innerhalb der Klasse änderbar zu machen. Vielleicht möchten Sie einen anderen Accessor mit einem anderen Namen in Betracht ziehen, der so konstruiert ist, dass er das veränderbare Array spezifisch zurückgibt.

    
quelle
1

Es ist immer noch Objective-C 2.0; der Compiler ist vielleicht nur ein wenig aktualisiert mit der Berücksichtigung dieser Art von Typ, der einen Fehler ändert. Es sollte eigentlich ein Fehler sein. Zumindest sollte es Sie warnen, dass Sie wahrscheinlich nicht meinen, was Sie geschrieben haben. Dann könntest du Sachen schreiben, damit es dich nicht warnt, was du mit der @synthesize -Anweisung nicht tun kannst.

Ich habe gerade Ihren Code und eine Synthetisierungsanweisung in meinen Controller eingefügt und ich habe keine Fehler oder Warnungen darüber erhalten. Es hat gut gebaut. Jetzt setze ich das Basis-SDK auf "Simulator 3.0" und den Build auf "Simulator 3.0 Debug". Dieses Projekt wurde im 2.2.1 SDK gestartet und ich habe gerade das 3.0 SDK installiert. Xcode ist Version 3.1.3.

Update : Oh, ich sehe, dass der Versuch, die Eigenschaft zu setzen, der Fehler ist, den Sie erwähnt haben.

%Vor%

Natürlich können Sie nicht @synthesize dieses Verhalten und müssen Ihre eigenen Accessoren schreiben.

%Vor%

Durch das Ausfüllen dieser Accessoren wurde die Nachricht nicht gelöscht. Daher musste ich den Zugriff auf Folgendes ändern:

%Vor%

Das Verwenden der obigen Syntax ohne benutzerdefinierte Zugriffsmethoden funktionierte ebenfalls nicht.

PS Wow, hat sich sonst jemand geärgert, dass Sie keine Nachrichtenblasen oder den Text im Build-Ergebnisfenster kopieren können?

    
dlamblin 19.06.2009 21:35
quelle
0

Das hat also wirklich mit dem Aufruf von @synthesize zu tun, der nicht glücklich darüber ist, ein NSMutableArray als NSArray verfügbar zu machen - warum nicht einfach getMethod implementieren?

Wenn Sie darüber nachdenken, muss es die Set-Methode sein, die nicht glücklich ist - Sie könnten kein NSArray in ein NSMutableArray setzen.

    
Grouchal 19.06.2009 19:05
quelle
0

Ihre Fragen waren:

  

Kennt jemand Änderungen an objective-c zwischen OS 2.2.1 und 3.0?

     

Gibt es Dokumentation für diese Änderungen?

Die definitive Antwort lautet:

1) Es gab keine absichtlichen Änderungen an der Sprachspezifikation, aber der Compiler und andere Entwicklerwerkzeuge wurden geändert. Chris und seine Mitarbeiter sind die Experten für diese Veränderungen.

2) Wahrscheinlich nicht, weil alle Änderungen unbeabsichtigt waren oder das Verhalten der Dokumentation besser angepasst wurden.

Sie sollten nicht so schnell die Antwort von Chris als "eine Vermutung" abtun. Chris arbeitet an Apples Entwicklertools. Sie könnten eine andere Antwort bekommen, die Ihnen mehr gefällt, aber Sie werden keine kompetentere Antwort bekommen.

    
Peter Bierman 28.06.2009 08:58
quelle