Potentielle Speicherlöcher

  • Potentielle Speicherlöcher

    Guten Morgen.

    Ich habe letztens den Analyze Befehl ausgeführt und bin dann aus allen Wolken gefallen. Die App funktioniert ansich ja ohne Probleme nur möchte ich trotzdem die ganzen Warnungen (oder was immer das ist) loswerden, falls das möglich ist.

    Vielleicht habt ihr ja ein paar Tipps für mich.

    Hier ist so ein Fall:

    Quellcode

    1. -(NSString*) getWord: (NSString*) word
    2. {
    3. NSMutableString *wordToConvert = [[NSMutableString alloc] initWithString:word];
    4. NSArray *arraySonderZeichen = [NSArray arrayWithObjects: @"ae", @"oe", @"ue", @"Ae" ,@"Oe", @"Ue", nil];
    5. for (int i=0 ; i< ([arraySonderZeichen count]) ; i++)
    6. {
    7. NSRange substr = [wordToConvert rangeOfString: [arraySonderZeichen objectAtIndex:i]];
    8. if (substr.location != NSNotFound)
    9. {
    10. if (substr.location == 0)
    11. {
    12. switch (i) { .....}
    13. }
    14. else
    15. {
    16. NSString *substr2 = [wordToConvert substringWithRange:NSMakeRange((substr.location-1), 1)];
    17. if ((substr2 != @"a") || (substr2 != @"i")|| (substr2 != @"o")|| (substr2 != @"u"))
    18. {
    19. switch (i) {
    20. case 0:
    21. [wordToConvert replaceCharactersInRange:substr withString:@"ä"];
    22. break;
    23. case 1:
    24. [wordToConvert replaceCharactersInRange:substr withString:@"ö"];
    25. break;
    26. case 2:
    27. [wordToConvert replaceCharactersInRange:substr withString:@"ü"];
    28. break;
    29. case 3:
    30. [wordToConvert replaceCharactersInRange:substr withString:@"Ä"];
    31. break;
    32. case 4:
    33. [wordToConvert replaceCharactersInRange:substr withString:@"Ö"];
    34. break;
    35. case 5:
    36. [wordToConvert replaceCharactersInRange:substr withString:@"Ü"];
    37. break;
    38. default:
    39. break;
    40. }
    41. }
    42. }
    43. }
    44. }
    45. return wordToConvert;
    Alles anzeigen



    Und zwar löst hier die Initialisierung(NSMutableString *wordToConvert = [[NSMutableString alloc] initWithString:word];) das Leck aus. Ist mir ja irgendwie klar nur da es mein Rückgabewert ist kann Ichs ja nicht releasen und da ich es bearbeiten muss kann ich keinen Zeiger verwenden.
    Das ganze in ähnlicher Form existiert ein paar mal in meinem Projekt.

    Bitte keine zu komplizierten Antwort bin Newbe (schreibt man das so?).

    mfg
    joe
  • ist das ganze nicht etwas kompliziert?

    warum verwendest du nicht einfach die replace-funktion von NSMutableString und rufst die 6 mal auf. fertig.

    zum eigentlichen problem: du sollt alloc-init vermeiden und convenience allocator verwenden. in diesem fall "stringWithString".

    oder eben wie gesagt ein autorelease senden.

    btw: der methondenname ist auch nicht korrekt so!
  • Hallo zusammen.

    Danke für eure Antworten. Autorelease hat das Loch gestopft. Danke vielmals. Und gritsch danke für den Tipp mit dem replace (Warum einfach wenn es auch kompliziert geht :) ) und der Rückgabewert muss natürlich NSMutableString sein. Habs gerade geändert.

    Mfg
    Joe