3 absolute Anfängerfragen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • 3 absolute Anfängerfragen

    Hallo allerseits,

    ich kämpfe mich in letzter Zeit durch die Dokumentationen von Apple, weil ich Objective C lernen will. Ich bin absoluter Neuling beim Programmieren. Auf Folgende fragen find ich einfach keine Antwort:

    1.)Seh ich es richtig, dass es Methoden gibt, die nur existieren um dem Programmierer die Möglichkeit zu geben, auf bestimmte Ereignisse zu reagieren (zB. applicationDidFinishLaunching),
    und dass diese Methoden noch garnichts machen, wenn man sie so aufrufen würde ohne sie vorher selbst nochmal zu implementieren?

    2.)

    Quellcode

    1. - (IBAction)changeGreeting:(id)sender {
    2. self.string = textField.text;
    3. NSString *nameString = string;
    4. if ([nameString length] ==0) {
    5. nameString = @"World";}
    6. NSString *greeting = [[NSString alloc] initWithFormat:@"Hello, %@!", nameString];
    7. label.text = greeting;
    8. [greeting release];

    den Code hab ich aus der Dokumentation.
    Mein Frage dazu: warum wird der "nameString" nicht allokiert und initiiert?

    3.)

    Quellcode

    1. UITextField *aTextField = [[UITextField alloc] initWithFrame:frame];
    2. self.textField = aTextField;
    3. [aTextField release];


    Warum macht man denn sowas? Das Objekt "aTextField" kommt sonst nirgends mehr im Code vor.


    Es würde mich freuen wenn sich jemand die mühe macht mir zu antworten oder mich dahin schickt wo ich Antworten finde.


    EDIT: Falsches Forum, verschieben bitte :D
  • ad 1):
    So kann man das sehen. applicationDidFinishLaunching ist eine Methode von NSObject, die erst mal "nichts" tut. Überschreibst Du sie in Deiner Unterklasse (von NSObject) wird bei ihrem Aufruf DEIN Code ausgeführt. Die Methode ist deshalb in NSObject implementiert, weil sonst ein Fehler auftreten könnte ("ObjectX doesn't respond to Methode yyy").
    Das Application-Objekt sendet diese Nachricht an sein Delegate, also das Applicaton-Delegate. Standardmäßig tut das Delegate in dieser Methode nichts (weil es die Implementierung der Oberklasse NSObjet verwendet).

    ad 2):
    NSString *nameString = string; bedeutet: nameString soll auf das selbe Objekt zeigen, auf das string zeigt. Es bedeutet nicht, daß nameString ein eigenes Objekt instanziert. Dazu müßtest Du den String instanzieren, entweder mit NSString *nameString = [[NSString alloc] init...] oder mit einem convenience allocator wie NSString *nameString = [NSString string];

    ad 3):
    Die erste Zeile instanziert ein Objekt der Klasse UITextField mit Namen aTextfield.
    Die zweite Zeile setzt die Instanzvariable "textField" des Objekts "self" auf den Inhalt von aTextfield, oder besser: beide aTextField und textField zeigen jetzt auf das gleiche, soeben instanzierte Objekt.
    Genauer formuliert, wird der textField-Setter von self aufgerufen, also -(void)setTextField:(NSString*)neuerString.
    Die dritte Zeile released aTextfield, weil es nicht mehr benötigt wird. Sein Inhalt ist ja über die Instanzvariable textField erreichbar.
    Man könnte auch verkürzt schreiben:
    self.textField = [[UITextField alloc] initWithFrame:frame];
    aTextField kann auch nirgendwo anders im Code mehr vorkommen, weil es nur lokal, also innerhalb der Methode bekannt ist. Würde aTextfield noch in einer anderen Methode verwendet werden, hätte es mit aTextfield in dieser Methode überhaupt nichts zu tun.

    No.
  • Vielen Dank für die schnellen Antworten!!
    Daran hatte ich mich ewig aufgehängt!

    So eine Frage hab ich jetzt doch noch. Deine Erklärung zu meiner 2ten Frage versteh ich so als ob ich jetzt ein Objekt mir 2 Namen hab. Tatsächlich könnte ich mir doch auch die Länge von "string" anschauen. Wieso sollte ich dazu dieses "nameString" einführen?
  • Du hast zwei Zeiger namens "nameString" und "string", die auf das selbe Objekt zeigen.
    Im Prinzip hast Du also recht.

    Der Sinn von "nameString" scheint hier folgender zu sein (wobei ich dazu sagen muß, dass ich die Methode natürlich auch mißverstehen kann, so ohne Zusammenhang):
    Schau Dir an, wie die Methode aussehen würde, wenn Du auf nameString verzichtest:
    "if ([self.string length] ==0) {..."
    Drei Tage später wäre schwer zu erraten, was hinter "string" steckt. Nennst Du das Ding in der Methode "nameString", weißt Du später eher, was der Code eigentlich tun soll.
    Da Du ja nur einen weiteren Zeiger anlegst und kein Objekt instanzierst, "kostet" es Dich auch nichts.

    No.