Schritt für Schritt - Entwickeln für OS X und iOS
Schritt für Schritt - Entwickeln für OS X und iOS
Accessor-Methoden

Im Kapitel „Klassen, Teil 1“ wurden schon die so genannten Accessor-Methoden angesprochen, eben jene Methoden, mit denen man auf die Instanzvariablen und deren Inhalte zugreifen kann.
Accessor-Methoden sind für eine Klasse notwendig, denn die Instanzvariablen selbst sind „privat“, das bedeutet, von ausserhalb der Klassen kann nicht darauf zugegriffen werden.

Man unterscheide dabei zwei verschiedene Methoden, den setter, der benutzt wird um Werte in eine Variable zu schreiben, und den getter, der zum Einsatz kommt, um den Variableninhalt wieder auszulesen.

Für die Variable
int age;
sehen die passenden Accessor-Methoden dann so aus:
-(void) setAge:(int)x
{
    age = x;
}
-(int) age
{
    return age;
}
Recht viel Schreibarbeit könnte man meinen, und das ist es zweifellos auch. Accessor-Methoden haben aber durchaus Sinn, denn Sie ermöglichen zum Beispiel den zu setzenden Wert zu kontrollieren. So können Sie beispielsweise sicherstellen, dass einer Person kein negatives Alter zugewiesen wird.

Weil das Erstellen von Accessor-Methode ein langweiliger und immer wiederkehrender Prozess ist, können Sie sich von Xcode den Großteil der Arbeit abnehmen lassen. Einzig die Variablendeklaration müssen sie noch selbst schreiben.
#import <Cocoa/Cocoa.h>

@interface Person : NSObject {

int age;

}

@end
Markieren Sie nun die Zeile int age; und wählen Sie aus dem Script Menü Code->Place Accessor Decls on Clipboard.
stacks_image_871EC794-2E9E-4024-AE6A-A3724DDD8EF9
Xcode erzeugt nun im Hintergrund Deklarationen für Accessor-Methoden. Diese können Sie nun ohne Schwierigkeiten durch den Befehl Edit->Paste oder durch die Tastenkombination cmd+v in die Headerdatei einfügen.
- (int)age;
- (
void)setAge:(int )value;
Genau so funktioniert es auch mit der Definition der Methoden, nur das Sie jetzt Place Accessor Defs on Clipboard wählen müssen. Diese Codeschnipsel gehören dann natürlich in die Code Datei.
- (int)age {
    return age;
}

- (
void)setAge:(int )value {
    if(age != value) {
        age = value;
    }
}
Wie Sie sehen wird hier sogar richtig intelligenter Code erzeugt, denn age wird nur überschreiben, wenn der Wert unterschiedlich ist. Noch interessanter wird es, wenn sie einen auf Zeiger basierten Datentype nutzen. Sollte dies Ihrer Neugierde geweckt haben ersetzen sie doch mal
(int)age
durch
NSNumber *age;
und wiederholen den ganzen Vorgang.

Es ist nicht zwingend getter und setter Methoden zu implementieren. Wollen Sie eine Variable, die nur setzbar ist, können sie auf den getter verzichten. Haben sie hingegen eine Variable, die nur lesbar sein soll, wie zum Beispiel ein Rechenergebnis, brauchen sie natürlich keinen setter.

nächste Seite