Probleme mit Strings/MutableStrings

  • Probleme mit Strings/MutableStrings

    Hallo!
    Ich versuche grad als erstes richtiges Programm einen Taschenrechner zu bauen. Jetzt komme ich aber leider nicht weiter. ich habe folgenden code:

    Quellcode

    1. - (IBAction)numberPressed:(id)sender
    2. {
    3. id theCell = [sender selectedCell];
    4. int x = [theCell tag];
    5. NSMutableString *y = [[NSNumber numberWithInt:x] stringValue];
    6. NSMutableString *z = [addNumber StringValue];
    7. [[addNumber stringValue] appendString:y];
    8. }


    und bekomme diese Fehlermeldung:

    [Session started at 2007-03-06 17:19:20 +0100.]
    2007-03-06 17:19:20.785 Calculator[7627] CFLog (0): CFMessagePort: bootstrap_register(): failed 1103 (0x44f), port = 0x3503, name = 'com.apple.myCocoaApplication.ServiceProvider'
    See /usr/include/servers/bootstrap_defs.h for the error codes.
    2007-03-06 17:19:20.809 Calculator[7627] CFLog (99): CFMessagePortCreateLocal(): failed to name Mach port (com.apple.myCocoaApplication.ServiceProvider)
    2007-03-06 17:19:22.569 Calculator[7627] *** -[NSTextField StringValue]: selector not recognized [self = 0x31f860]
    2007-03-06 17:19:22.570 Calculator[7627] *** -[NSTextField StringValue]: selector not recognized [self = 0x31f860]

    Calculator has exited with status 0.


    Wenn ich den code ändere in:

    Quellcode

    1. - (IBAction)numberPressed:(id)sender
    2. {
    3. id theCell = [sender selectedCell];
    4. int x = [theCell tag];
    5. NSMutableString *y = [[NSNumber numberWithInt:x] stringValue];
    6. NSMutableString *z = [addNumber stringValue];
    7. [z appendString:y];
    8. [addNumber setStringValue:z];
    9. }


    bekomm ich diese Fehlermeldung:

    [Session started at 2007-03-06 17:20:35 +0100.]
    2007-03-06 17:20:36.216 Calculator[7654] CFLog (0): CFMessagePort: bootstrap_register(): failed 1103 (0x44f), port = 0x3503, name = 'com.apple.myCocoaApplication.ServiceProvider'
    See /usr/include/servers/bootstrap_defs.h for the error codes.
    2007-03-06 17:20:36.217 Calculator[7654] CFLog (99): CFMessagePortCreateLocal(): failed to name Mach port (com.apple.myCocoaApplication.ServiceProvider)
    2007-03-06 17:20:37.200 Calculator[7654] Attempt to mutate immutable object with appendString:
    2007-03-06 17:20:40.530 Calculator[7654] Attempt to mutate immutable object with appendString:

    Calculator has exited with status 0.


    Und ich weiß jetzt wirklich nicht was ich machen soll.
    Kann mir jemand sagen wie ich y hinter z krieg?
    Egal bei welchem code.
    Danke im Vorraus.

    Und sorry falls ihr diesen Thread als unnötig empfindet.
    Wenn Word für längeres gemacht wäre, würde es Sentence, Page oder Article heißen.
  • Versuch mal was in Richtung:

    Quellcode

    1. NSMutableString *z = [[addNumber stringValue] mutableCopy];

    ... nur weil du z als NSMutableString deklarierst, ist es noch lange keiner ;)
    stringValue gibt nämlich einen normalen NSString zurück...
  • Noch was zum merken: Selektoren werden IMMER klein am Anfang geschrieben (Camel Casing), einen Selektor StringValue gibt es also nicht, da die Schreibweise einem Klassennamen oder Interface entspräche. Y muss natürlich auch kein NSMutableString sein, den veränderst du ja nicht...
  • Wenn ich das jetzt richtig überblicke, nur y.
    So als Faustregel: Alles, was init..., new oder copy/mutableCopy heißt, hat einen retain-count von 1 und ist nicht im Autorelease Pool (frei nach Hillegass). Bei allem anderen kannst du davon ausgehen, dass es im Autorelease Pool ist und du es nicht releasen musst/darfst.
  • Du musst alles releasen, was du mit +alloc, -copy oder -mutableCopy angelegt hast. Einfacher ist es allerdings, gleichn einen convenience Copy zu verwenden:

    Quellcode

    1. // anstelle von
    2. theCopy = [theString mutableCopy];
    3. [theCopy release];
    4. // lieber gleich
    5. theCopy = [NSMutableString stringWithString:theString];

    Frei nach Rodewig/Negm, S. 189
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • ich glaub ich habs versaut

    ich wollte mathematische zeichen von der zeichenpalette integrieren musste dafür aber auf unicode "promoten"
    jetz geht gar nichts mehr

    weiß jemand wie ich das wieder zürück bekomm?
    das war vorher auf UTF8 oder so
    Wenn Word für längeres gemacht wäre, würde es Sentence, Page oder Article heißen.
  • Wenn du das selber bauen willst, wird das schwierig... Zumal du ja Punkt-vor-Strichrechnung, Klammerung etc. berücksichtigen müsstest. So einen Parser zu bauen, ist jedenfalls nicht unbedingt leicht... wenn auch möglich.
    Eine recht einfache, wenn auch etwas unorthodoxe Möglichkeit, die mir gerade einfällt, wäre es, den ganzen String einfach als AppleScript ausführen zu lassen.
    Das ginge in etwa so:

    Quellcode

    1. NSString *theString = @"42 + 3 * 8" //so als Beispiel...
    2. NSAppleScript *appleScript;
    3. NSDictionary *errorDict;
    4. NSAppleEventDescriptor *ae;
    5. appleScript = [[NSAppleScript alloc] initWithSource:theString];
    6. ae = [appleScript executeAndReturnError:&errorDict];
    7. NSString *result = [ae stringValue];
    8. [appleScript release];

    Ist nur so eine Idee, gibt wahrscheinlich 1358 andere Möglichkeiten... In result ist dann dein Ergebnis, das du natürlich mit -floatValue etc. wieder in eine Zahl umwandeln kannst...