
Die Initialisierung ist etwas, was Sie bereits kennen. Ein Beispiel hierfür war:
Bruch *meinBruch = [[Bruch alloc] init];
Danach haben Sie der neuen Instanz üblicherweise Variablen zugewiesen, z.B.:
[meinBruch setze: 1 durch: 4];
Dies kann auch durch einen einzigen Schritt geschehen und wird auch häufig so gemacht. Dafür kann man z.B. eine initWith: Methode implementieren. Natürlich könnten Sie diese Methode auch in deutscher Sprache implementieren (z.B. initialisiereMit::), aber initWith: ist eine häufig verwendete Methode von bereits bestehenden Klassen. Z.B. NSArray besitzt bereits eine große Zahl an initWith: Methoden.
-initWithArray;
-initWithArray:copyItems;
-initWithContentsOfFile;
...etc....
NSArray besitzt eine große Zahl von Methoden und Instanzvariablen, weshalb mehrere Initialisierungen nötig sind. Eine Instanz von NSArray kann demnach auch folgendermaßen initialisiert werden:
meinArray = [[NSArray alloc] initWithArray: meinAnderesArray];
Üblicherweise beginnen alle Initialisierungsmethoden mit init...., das ist kein muss - bekanntlich können Sie eine Methode die Sie selbst implementieren nennen wie Sie wollen - es ist aber wieder eine jener ungeschriebenen Gesetze, die Ihnen und anderen Programmieren das Leben erleichtern und Programme leichter lesbar machen. Die Initialisierung von Instanzen ist oftmals eine recht diffiziele Angelegenheit. Sie müssen beim Programmieren sicherstellen, dass alle Instanzvariablen initialisiert wurden. Die einfachste Methode ist es, zuerst die die Initialisierungsmethode der Elternklasse aufzurufen (welche in aller Regel init ist) um danach die eigenen Instanzvariablen zu initialisieren. Als Beispiel wieder in Anlehnung an das Bruch-Programm, würde die Implementierung so aussehen:
- (Bruch *) initWith: (int) z : (int) n
{
self = [super init]
if (self)
[self setze: z durch: n];
return self;
}
Lassen Sie sich nich verführen. Zwischen init und initWith: gibts einen großen Unterschied. Init ist eine Methode die in der Superklasse Object bereits implementiert wurde, diese Methode können Sie also jederzeit aufrufen, initWith beinhaltet zwar auch das Wort init, ist aber eine Methode, welche die Superklasse Object nicht kennt Sie diese Methode eben zuerst implementieren müssen. Zuerst wird die Elternklasse initialisiert. Im Falle von Bruch ist dies die Superklasse Object. Das Ergebnis dieses Aufrufs - die Antwort - muss letztlich an self übergeben werden, weil ein Initialsierer das Recht hat, das Objekt im Speicher zu verschieben. Nach der Initialisierung von super - und dessen Antwort in Form eines Wertes - wird die setzte:durch: Methode verwendet um den Zähler und Nenner zu setzen. In den Programmabschnitt müssen Sie dann folgende Zeile einfügen:
a = [[Fraction alloc] initWith: 1 :3];
Wenn ein Programm gestartet wird, wird die intialize Methode zu allen Klassen gesendet. Zuerst die Elternklassen, dann die Kindklassen. Diese Nachricht wird nur einmal an jede Klasse gesendet und zwar als erste Nachricht bevor andere Nachrichten an die Klasse gesendet werden. Der Zweck für Sie ist es, die Ausführung einer jeder Klassen-Intialisierung zu diesem Zeitpunkt.
weiter ---- Objective-C Index ---- Startseite----zurück
EINSTIEG
KAPITEL 1: SCHRITT FÜR SCHRITT ZUM ERSTEN PROGRAMM
KAPITEL 2: OBJEKTE, KLASSEN, INSTANZEN UND METHODEN
KAPITEL 3: DIE VERSCHIEDENEN DATENTYPEN
KAPITEL 4: DIE PROGRAMMSCHLEIFEN
KAPITEL 5: ENTSCHEIDE DICH, ENTWEDER ODER....
KAPITEL 6: UND NOCHMALS KLASSEN
KAPITEL 7: VERERBUNG
KAPITEL 8: POLYMORPHISMUS, DYNASCHISCHE TYPISIERUNG UND DYNAMISCHES BINDEN
KAPITEL 9: NOCH MEHR DATENTYPEN UND VARIABLEN
KAPITEL 10: CATEGORIES, POSING AND PROTOCOL
KAPITEL 11: DER PRÄPROZESSOR