Du bist nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: OS X Entwicklerforum. Falls dies dein erster Besuch auf dieser Seite ist, lies bitte die Hilfe durch. Dort wird dir die Bedienung dieser Seite näher erläutert. Darüber hinaus solltest du dich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutze das Registrierungsformular, um dich zu registrieren oder informiere dich ausführlich über den Registrierungsvorgang. Falls du dich bereits zu einem früheren Zeitpunkt registriert hast, kannst du dich hier anmelden.

1

Dienstag, 1. Mai 2012, 10:17

Wie greift man korrekt auf eigene Instanzvariablen zu?

Hi

Bin gerade an meinem ersten eigenen Programm um in Objective C reinzukommen. Und jetzt habe ich mich nach ein bisschen Suchen gefragt, was der Unterschied ist wie man auf Instanzvariablen aus Methoden darauf zugreift?

Wenn es in meiner Klasse eine Variable a gibt, was ist der Unterschied zwischen diesen drei Schreibweisen zbsp. in der Init Methode:

Quellcode

1
self->a = 1;self.a = 1;a = 1;



Zumindest letztere hat bei mir ohne Probleme funktioniert..

Beiträge: 9 884

Wohnort: Klüngelshausen

Beruf: 1,5

Hobbys: Maulaffen feilhalten, Starkstrom

  • Private Nachricht senden

2

Dienstag, 1. Mai 2012, 10:31

Nur bei der ersten und der dritten Variante greifst Du auf die Ivar direkt zu. Dabei brauchst Du die erste Version nur, wenn Du Namenskonflikte vermeiden willst, weil beispielsweise eine lokale Variable oder einen Parameter gleichen Namens hast.

Bei der zweiten Variante greifst Du auf den Setter für a zu. Du rufst also in der Regel eine Methode auf. Ich verwende bevorzugt diesen Zugriff, da der Code dadurch am flexibelsten ist.
„Meine Komplikation hatte eine Komplikation.“

Apps programmieren für iPhone und iPad

Beiträge: 4 326

Wohnort: Ruhrgebiet, NRW

Beruf: Mac Indie / Freelancer

  • Private Nachricht senden

3

Dienstag, 1. Mai 2012, 10:38

Bei self.a = 1 wird der Setter verwendet, d.h. es wird die Methode setA: aufgerufen, welche z.B. so aussieht:

Quellcode

1
2
3
4
-(void)setA:(xxx)value
{
  a = value;
}

Ist die o.a. Methode nicht vorhanden dann gibt es einen Laufzeitfehler. Allerdings sollte sich beim Build der Compiler mit einer Warning melden, wenn es den Setter nicht gibt. Über @property und @synthesize lassen sich, ja nach Property Definition, Getter ggf. Setter und sogar die Variable automatisch erzeugen.

Bei a = 1 wird direkt auf die Variable zugegriffen und der neue Werte gesetzt. Selbst wenn es einen Setter gibt, also die Methode setA: vorhanden ist, dann wird dieser in diesem Fall einfach ignoriert.

4

Dienstag, 1. Mai 2012, 11:31

Aber theoretisch kann man auch nur a = 1 schreiben, die anderen beiden Wege macht man eigentlich nur um Namenskonflikte zu vermeiden?

Und gibt es ein für und wider? Ich meine gerade mit dem setter muss jedesmal eine Funktion aufgerufen werden, am optimalsten ist vermutlich self->a = 1 oder?

Beiträge: 1 496

Wohnort: Kölle

Beruf: Schüler

Hobbys: Handball

  • Private Nachricht senden

5

Dienstag, 1. Mai 2012, 11:41

Propertys bzw. setter/Getter sind auch für die Speicherverwaltung gut
Gruß

Robin

Beiträge: 9 658

Wohnort: Suedtirol (Italien)

Beruf: Software-Entwickler

  • Private Nachricht senden

6

Dienstag, 1. Mai 2012, 11:50

setter sollte man verwenden wenn man nicht einfache datentypen verwendet da es dort um speicherverwaltung geht.

für eine int-variable würd ich auch keinen setter verwenden, außer ich müsste von außerhalb der klasse den wert setzen.

Beiträge: 19 423

Wohnort: Köln

Beruf: Rechtsanwalt

Hobbys: FSK18

  • Private Nachricht senden

7

Dienstag, 1. Mai 2012, 15:26

Aber theoretisch kann man auch nur a = 1 schreiben, die anderen beiden Wege macht man eigentlich nur um Namenskonflikte zu vermeiden?

Und gibt es ein für und wider? Ich meine gerade mit dem setter muss jedesmal eine Funktion aufgerufen werden, am optimalsten ist vermutlich self->a = 1 oder?

Nein, man macht sie nicht nur, um Namenskonflikte zu vermeiden. Wie bereits erwähnt, vereinfacht es die Speicherverwaltung. Darüber hinaus – und das ist wichtiger –, kapselst du damit den Zugriff und kannst in der Methode -setA: Konsistenzen herstellen. So kann es etwa sein, dass A eine Beziehung darstellt zu der es eine Rückbeziehung gibt, die gesetzt werden muss. Zudem kann je nach Art der Eigenschaft es sinnvoll sein, eine Kopie des Parameters anzufertigen. Daher verwendet man auch in Programmiersprachen, die kein "Problem" mit der Speicherverwaltung haben, jedenfalls nicht an dieser Stelle, Setter.

Es wird jedes Mal eine Methode aufgerufen. Wieso ist das ein Nachteil?
Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
verhindert man die Leaks, so verhindert man auch die Begrenzung auf 128 Abfragen

8

Dienstag, 1. Mai 2012, 15:42

Ich werfe dann mal noch KeyValueObserving in den Ring...

Beiträge: 19 423

Wohnort: Köln

Beruf: Rechtsanwalt

Hobbys: FSK18

  • Private Nachricht senden

9

Dienstag, 1. Mai 2012, 15:44

Ich werfe dann mal noch KeyValueObserving in den Ring...

Sehr richtig!
Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
verhindert man die Leaks, so verhindert man auch die Begrenzung auf 128 Abfragen

Beiträge: 9 884

Wohnort: Klüngelshausen

Beruf: 1,5

Hobbys: Maulaffen feilhalten, Starkstrom

  • Private Nachricht senden

10

Dienstag, 1. Mai 2012, 16:41

Aber theoretisch kann man auch nur a = 1 schreiben, die anderen beiden Wege macht man eigentlich nur um Namenskonflikte zu vermeiden?

Die erste Variante vermeidet den Namenskonflikt und ist äquivalent zur dritten Variante. Der Compiler setzt die Anweisung a = 1; in die gleiche Befehlsfolge wie self->a = 1; um. Die zweite Anweisung ist ein Methodenaufruf.
„Meine Komplikation hatte eine Komplikation.“

Apps programmieren für iPhone und iPad

11

Dienstag, 1. Mai 2012, 20:29

Ok alles klar. Aber wenn ich Getter und Setter über properties mache, hat es ja keinen Einfluss ob ich über self oder die Methoden zuweise.
Vielen Dank, wieder was gelernt :-)

Beiträge: 19 423

Wohnort: Köln

Beruf: Rechtsanwalt

Hobbys: FSK18

  • Private Nachricht senden

12

Mittwoch, 2. Mai 2012, 14:22

Ok alles klar. Aber wenn ich Getter und Setter über properties mache, hat es ja keinen Einfluss ob ich über self oder die Methoden zuweise.
Vielen Dank, wieder was gelernt :-)

??????????????????????????

self->prop = …
ist etwas komplett anderes als
[self setPorop:…] // entspricht self.prop = …

Übrigens hat das gar nichts mit self zu tun, auch wenn es an dieser Stelle immer besprochen wird.
Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
verhindert man die Leaks, so verhindert man auch die Begrenzung auf 128 Abfragen

Social Bookmarks