event charakters zum String

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

  • event charakters zum String

    Ich habe ein keyDown event und es funktioniert auch:

    Quellcode

    1. - (void)keyDown:(NSEvent *)theEvent {
    2. NSLog([theEvent characters]);
    3. }


    wenn ich es aber so mache:

    Quellcode

    1. - (void)keyDown:(NSEvent *)theEvent {
    2. NSString *text = [text stringByAppendingFormat:[theEvent characters]];
    3. NSLog(@"%@", text);
    4. }


    stürzt das Programm ab. Oder gibt einen Wert von (null) aus.
    Was mache ich falsch ?
    Danke schonmal
  • Du hast ein gewisses Problem mit Grundlagen.

    Kurz: nach Verlassen deiner keyDown-Methode wird 'text' wieder freigegeben.
    Zusätzlich willst du einem nicht instanziierten Objekt eine Instanznachricht schicken.

    Leg dir für so etwas bitte eine Property an und nutze die Getter und Setter.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Viper OS X schrieb:

    kann mir nicht einer die eine Zeile eben vorsagen und nicht immer nur tipps geben :D ?

    C-Quellcode

    1. - (void)keyDown:(NSEvent *)theEvent {
    2. [self setText:[[self text] stringByAppendingFormat:[theEvent characters]]];
    3. NSLog(@"%@", [self text]);
    4. }


    Und wenn du jetzt feststellst, dass das Fehler wirft: beheb sie. :P
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • zerm schrieb:

    Ich lern auch immer wieder dazu. Ich hätte auf den ersten Blick nicht gedacht, dass
    NSString *text = [text stringByAppendingFormat:[theEvent characters]];
    funktioniert.
    Ein kurzer Test hat mir aber bestätigt, dass es schon valides C ist:
    int x = x + 5;


    Das ist ja aber auch ein kleiner Unterschied.
    Der int ist kein Objekt und muss somit auch nicht initialisiert werden.

    Ich würde auch behaupten, dass man nicht zu 100% davon ausgehen darf, dass bei int x = x + 5 am Ende 5 rauskommt.

    Und die Zeile NSString *text = [text stringByAppendingFormat:[theEvent characters]] geht übrigens nicht.
    Erstens kommt da sowieso erstmal eine Warnung in Xcode die man gezielt ignorieren muss: Variable 'text' is uninitialized when used within its own initialization,
    zweitens kam es ja gerade deshalb zu dem Crash (bzw. der null Ausgabe) den der Threadstarter beobachtet hat.

    Der Pointer text zeigt eben nicht auf ein NSString Objekt, weswegen der Versuch die Nachricht stringByAppendingFormat: dort hinzuschicken keine gute Idee ist. ;)
  • Na, im Prinzip ist es schon das gleiche. "int x" ist genauso uninitialisiert wie "NSString* text".

    Und es "geht" im Sinne von "es gibt kein Compiler-Fehler" (sondern nur eine Warnung, also es ist ein legales Konstrukt in der Sprache). Ich war überrascht (aber es klingt ja schlüssig), dass die Definition einer Variable schon vor dem "=" abgeschlossen ist, so dass man überhaupt hinter dem "=" schon auf sie zugreifen kann. Mir fällt aber keine sinnvolle Verwendung dieser Eigenschaft ein.
    C++
  • zerm schrieb:

    Na, im Prinzip ist es schon das gleiche. "int x" ist genauso uninitialisiert wie "NSString* text".

    Und es "geht" im Sinne von "es gibt kein Compiler-Fehler" (sondern nur eine Warnung, also es ist ein legales Konstrukt in der Sprache). Ich war überrascht (aber es klingt ja schlüssig), dass die Definition einer Variable schon vor dem "=" abgeschlossen ist, so dass man überhaupt hinter dem "=" schon auf sie zugreifen kann. Mir fällt aber keine sinnvolle Verwendung dieser Eigenschaft ein.

    Wie wäre es mit

    Quellcode

    1. void *hier=&hier;

    Wobei es compilerbautechnisch interessant wäre was bei

    Quellcode

    1. int x[]={ x[0], x[1], x[2] };

    passiert...

    Vermutlich funktioniert das einfach. Und zwar weil der Compiler erst mal einen AST baut und von dort weiß er dann
    1. er muss ein Array anlegen
    2. die Dimension bestimmt sich aus der Zahl der Terme hinter dem =, also hier 3 (völlig unabhängig was da genau steht)
    3. damit kann er rechnen: Speicherbedarf für Variable 'x' ist 3*sizeof(int)
    --- hier ist die Defintion abgeschlossen ---
    4. dann löst er die Initialisierung in 3 Zuweisungen auf schon bekannte Objekte auf: x[0]=x[0] (und hier braucht es eben keine Fallunterscheidung zu x[0]=y[0])
    5. kann er das evtl. wegoptimieren.