Schritt für Schritt - Entwickeln für OS X und iOS
Schritt für Schritt - Entwickeln für OS X und iOS
Key-Value Coding

Unter Key-Value Coding versteht man ein spezielles Verfahren, bei dem der Inhalt einer Variable über dessen Namen abrufen kann. Das ist nicht ungewöhnlich, werden Sie vielleicht denken, Variablen werden immer über den Variablennamen angesprochen. Aber haben Sie Geduld, es ist nicht so wie Sie vielleicht denken.
Die Anwendung in diesem Kapitel ist der Einfachheit halber wieder ein Foundation Tool. Gegeben sei die folgende Klasse: person.

person.h
#import <Cocoa/Cocoa.h>

@interface Person : NSObject {

    NSNumber *alter;
    NSString *name;
    NSString *vorname;
}

- (NSNumber *)alter;
- (
void)setAlter:(NSNumber *)value;

- (NSString *)name;
- (
void)setName:(NSString *)value;

- (NSString *)vorname;
- (
void)setVorname:(NSString *)value;


@end
person.m
#import "Person.h"

@implementation Person

- (NSNumber *)alter {
    return[[alter retain] autorelease];
}

- (
void)setAlter:(NSNumber *)value {
    if(alter != value) {
        [alter release];
        alter = [value copy];
    }
}

- (NSString *)name {
    return[[name retain] autorelease];
}

- (
void)setName:(NSString *)value {
    if(name != value) {
        [name release];
        name = [value copy];
    }
}

- (NSString *)vorname {
    return[[vorname retain] autorelease];
}

- (
void)setVorname:(NSString *)value {
    if(vorname != value) {
        [vorname release];
        vorname = [value copy];
    }
}

@end
Das sind nur Accessor-Methoden und wenn Sie im letzten Kapitel gut aufgepasst haben, wissen Sie, dass sie diesen ganzen Code nicht von Hand schreiben müssen.

Erzeugen Sie nun in der main-Methode eine Instanz dieser Klassen, füllen Sie die Variablen mit Werten und geben Sie diese anschließend wieder aus.
#import <Foundation/Foundation.h>
#import "Person.h"

intmain (intargc, const char* argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    Person *myPerson = [[Person alloc] init];
    [myPerson setAlter:[NSNumber numberWithInt:
32] ];
    [myPerson setName:
@"Müller"];
    [myPerson setVorname:
@"Max"];

    NSLog(
@"Name: %@",[myPerson name]);
    NSLog(
@"Alter: %@",[myPerson alter]);
    NSLog(
@"Vorname : %@",[myPerson vorname]);

    [myPerson release];
    [pool drain];
    return 0;
Das sollte für Sie inzwischen nichts Neues mehr sein und das Ergebnis auch nicht unerwartet.
stacks_image_CE354ABB-BE90-435E-8A8A-A2BA11075918
Wie Anfangs angekündigt wollen wir den Inhalt einer Variablen über dessen Namen abrufen. Ändern Sie deshalb die Zeile
NSLog(@"Name: %@",[myPerson name]);
in
NSLog(@"Name: %@",[myPerson valueForKey:@"name"]);
Das sieht auf den ersten Blick nur nach einer alternativen Schreibweise aus, aber vielleicht ahnen Sie wie es weiter geht. Die Variable wird hier über einen NSString abgefragt, und so ein String kann wiederum eine Variable sein.
NSString *wert = @"name";
NSLog(
@"Name: %@",[myPerson valueForKey:wert]);
Nun wird das ganze hoffentlich klarer, ein NSString, der Variablennamen zum Inhalt hat, führt zur Ausgabe des Variableninhaltes. Genau dies tut valueForKey. Dabei muss wert nicht zwangsläufig im Code festgelegt werden, es könnte eben so gut eine Eingabe eines Benutzers sein.

Es ist natürlich fatal einen Key abzufragen, der in der Klasse nicht vorhanden ist. Dieses wird das Programm zum Absturz bringen und kein noch so guter Compiler wird Sie davor warnen können, wenn der Key erst zur Laufzeit festgelegt wird. Vorsicht ist also angebracht.

Natürlich kann durch Key-Value Coding auch ein Wert gesetzt werden.
NSString *wert = @"name";
NSLog(
@"Name: %@",[myPerson valueForKey:wert]);
Key-Value Coding ist übrigens sehr praktisch bei der Verwendung von AppleScript und nahezu unverzichtbar bei der Anwendung von Databinding.

Eine praktische Verwendung des Key-Value Coding werden Sie in einem späterem Beispiel sehen, NSTableView Teil 2.

nächste Seite