• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

Die Fragen eines Lernenden

Ch-Macuser

Roter Delicious
Registriert
26.11.06
Beiträge
93
Hallo zusammen

Ich bin im Moment dabei, mit der Hilfe des Buches Objective-C und Cocoa programmieren zu lernen. Manche werden mir zu einem anderen Einstieg raten, aber so wie ich hier im Forum gelesen habe, gibt es die wie Sand am Meer;).

So, nun das eigentliche Problem. Ich habe das Buch gelesen, ohne gross nachzuprüfen und
selber zu coden. Jetzt will ich das in einem zweiten Anlauf nochmal lesen und auch verstehen, dass ich es selbst nutzen kann. Deshalb will ich auch einen Code verstehen, bevor ich weitergehe. Daher poste ich jetzt mal zwei Codestücke und stelle dann Fragen dazu:

Code:
@interface Instrument : NSObject {
    NSString *Name;
    int Preis;
    int Alter;
}
- (void)setName:(NSString *)[COLOR=Blue]cName[/COLOR];
- (int)setPreis:(int)[COLOR=Blue]cPreis[/COLOR];
- (int)setAlter:(int)[COLOR=Blue]cAlter[/COLOR];
- (NSString *)printData;
@end
Code:
#import "Instrument.h"

@implementation Instrument
- (void)setName:(NSString *)cName
{
    NSLog(@"Methode %@ von Objekt [COLOR=Red]\"%@\"[/COLOR] aufgerufen", NSStringFromSelector(_cmd), cName);
    [COLOR=Blue]Name = cName;
[COLOR=Black] }[/COLOR][/COLOR]

- (int)setPreis:(int)cPreis;
{
    NSLog(@"Methode %@ von Objekt [COLOR=Red]\"%@\"[/COLOR] aufgerufen", NSStringFromSelector(_cmd), Name);
    [COLOR=Blue]Preis = cPreis[/COLOR];
}

- (int)setAlter:(int)cAlter;
{
    NSLog(@"Methode %@ von Objekt [COLOR=Red]\"%@\"[/COLOR] aufgerufen", NSStringFromSelector(_cmd), Name);
    [COLOR=Blue]Alter = cAlter;[/COLOR]
}

- (NSString *)printData
{
    NSLog(@"Methode %@ von Objekt [COLOR=Red]\"%@\"[/COLOR] aufgerufen", NSStringFromSelector(_cmd), Name);
    NSLog(@"[COLOR=Red]\"%@\"[/COLOR] - Preis: %i", Name, Preis);
    NSLog(@"[COLOR=Red]\"%@\"[/COLOR] - Alter: %i", Name, Alter);
}

@end

Jetzt die Fragen:
1. Sehe ich das richtig, das oben im Interface zuerst die Variablen und die Funktionen (welche Methoden heissen, oder?) definiert werden, die in einer Klasse benutzt werden sollen?

2. Was hat es mit den Stellen cPreis, cAlter auf sich; wie kommt das zu Stande. Der NSLog gibt eben einen Log aus, und wenn ich den weglasse, dann ist die Implementation der Methode setPreis doch nur noch Preis = cPreis. Ich stelle die wildesten Vermutungen darüber an, aber es will sich mir nicht so ganz erschliessen.

3. Wie zum Teufel kommt man auf diese roten Monster? Ich weiss, %@ bedeutet Objekt und %i bedeutet integer, also eine Zahl (oder?) aber das sprengt bei mir den Rahmen

4. Könnt ihr mir noch weitere Onlineliteratur über Ojective-C empfehlen? Im Moment bin ich leider knapp bei Kasse, so dass ich mir leider kein neues Buch anschaffen kann.

In dem Sinne bedank ich mich jetzt schonmal für Hilfestellungen und hoffe, dass das einigermassen verständlich formuliert ist.

Gruss Johannes
 

Peter Maurer

Pommerscher Krummstiel
Registriert
16.03.04
Beiträge
3.077
Was hat es mit den Stellen cPreis, cAlter auf sich; wie kommt das zu Stande.
Das sind eben die Parameter (lokale Variablen) der jeweiligen setEigenschaft-Funktionen. Vielleicht fragst Du Dich, warum man nicht einfach die Eigenschaft-Variablen direkt setzt, ohne ueber eine setEigenschaft-Funktion zu gehen; und dafuer gibt es viele Gruende. Zwei davon sind:

  • Abkapselung von Klasseninterna gegenueber anderen Klassen, die diese Interna nichts angehen
  • Einfachere Abwandlung bestimmter Verhaltensweisen in Subklassen (betrifft vor allem auch "Ausles"-Methoden wie z.B. - (NSString*)name, die in Deinem Beispiel zwar fehlen, oft aber sehr von Nutzen sind.
Wie zum Teufel kommt man auf diese roten Monster? Ich weiss, %@ bedeutet Objekt und %i bedeutet integer, also eine Zahl (oder?) aber das sprengt bei mir den Rahmen
Siehe auch hier. %@ ist genauer gesagt ein Platzhalter fuer das Ergebnis der descriptionwithLocale/description-Methode eines Objekts.

Die \"\"-Zeichen drumrum sind nichts weiter als ge-escape-te Anfuehrungszeichen, d.h. Anfuehrungszeichen, die den Format-String der NSLog-Funktion nicht beenden, sondern Teil desselben werden sollen. Mann kann das auch anders machen: Ich z.B. schreibe gerne <%@> statt \"%@\" -- das sieht gleich ein bisschen weniger wild aus. :D

Ausserdem bist Du ohnehin nicht verpflichtet, solche abgrenzenden Zeichen um Deine %@ herum zu setzen; aber manchmal hilft das eben, die Objektbeschreibung vom restlichen NSLog-Text zu unterscheiden.

Könnt ihr mir noch weitere Onlineliteratur über Ojective-C empfehlen?
CocoaDev, CocoaDevcentral.
 

Ch-Macuser

Roter Delicious
Registriert
26.11.06
Beiträge
93
Ach so, das mit der setEigenschaft läuft also so ab, dass zuerst eine cWasauchimmer-Variable erzeugt wird und diese dann mit der globalen Variablen abgeglichen wird, mit dem Sinn und Zweck, dass nur diese Klasse diese Variablen nur mit dem Aufruf der setEigenschaft-Methode ändern können und nicht direkt manipulieren. Das heisst, wenn man z. B. den Preis
aus einer andern Klasse heraus ändern möchte, dann geht das über die setPreis methode der Inhaberklasse dieser Variablen.

Ich denke, ich habe das jetzt verstanden. Und es ist ja bekanntlich Übung, die den Meister macht :p.

Und die Anführungszeichen...
Das ist mir jetzt auch klar. Das läuft so ähnlich wie in der Mathematik:
(a*(b+c)*d) ≠ (a*b)+(c*d)
und entsprechend:
NSLog:mad:"asdf \"%@\" jklö" ≠ NSLog:mad:"asdf "%@" jklö"
oder so ähnlich :innocent:

Auf jedne Fall bedanke ich mich ganz herzlich für eure Hilfe.

Gruss Johannes
 

ChrisDD

Gloster
Registriert
21.02.04
Beiträge
64
Würde mir auf jeden Fall Bücher zum Thema: "objektorientierter Entwurf und Design" besorgen. Auch wenn sie nicht direkt was mit Programmierung an sich zu tun haben. Dir werden viele Dinge (wie set... und get...) wesentlich klarer werden.

Beispiel wären:
Lehrbuch der Objektmodellierung
von Heide Balzert

Praxisbuch Objektorientierung
von Bernhard Lahres und Gregor Raýman
gibts auch kostenlos unter: openbook

Ich denke, dass zweite ist zumindest für den Anfang ganz ok.

Gruß
Chris