Предупреждение о нехватке памяти после внедрения Rot13

Недавно я добавил в свой проект функцию rot13, чтобы я мог получить нужную строку. Пример кода был найден в Интернете. Сразу после вращения строки я получаю предупреждение о нехватке памяти и на 100% уверен, что это произошло из-за функции гниения. Нет предупреждений о нехватке памяти до rot13. Вот мой код:rot13.h

#import <Foundation/NSString.h>

@interface NSString (rot13)
+ (NSString *)rot13:(NSString *)theText;
@end

rot13.m

#import "rot13.h"
@implementation NSString (rot13)

+ (NSString *)rot13:(NSString *)theText {
    NSMutableString *holder = [[NSMutableString alloc] init];
    unichar theChar;
    int i;

    for(i = 0; i < [theText length]; i++) {
        theChar = [theText characterAtIndex:i];
        if(theChar <= 122 && theChar >= 97) {
            if(theChar + 13 > 122)
                theChar -= 13;
            else
                theChar += 13;
            [holder appendFormat:@"%hhd", (char)theChar];


        } else if(theChar <= 90 && theChar >= 65) {
            if((int)theChar + 13 > 90)
                theChar -= 13;
            else
                theChar += 13;

            [holder appendFormat:@"%C", theChar];

        } else {
            [holder appendFormat:@"%C", theChar];
        }
    }

    return [NSString stringWithString:holder];
}

@end

И я гнил свою строку, как это:

NSString *mystring=[defaults stringForKey:@"name"];
NSString *rotted = [NSString rot13:mystring];

Любая помощь? Должен ли я выпустить что-то? Почему эта простая задача вызывает предупреждения о нехватке памяти?

2 ответа

Для каждого символа в строке вы используете как процессор форматирования строки (медленный), так и добавление одного символа в изменяемую строку (также медленный). Вероятно, одной из этих операций является создание какой-либо строки с автоматическим выпуском в качестве детали реализации. В сочетании с посимвольной операцией это может легко привести к нехватке памяти.

Лучшим решением было бы сделать изменяемую копию входной строки, а затем перебирать символы, заменяя каждый из них на ходу. Обратите внимание, что ROT13 с треском провалится из-за не 7-битного ASCII; Unicode заставит его взорваться. Если я правильно помню, unichar16-битный тип

Скорее всего, добавление этой строки создает кучу временных строк, которые не освобождаются до завершения метода.

Вы могли бы создать NSMutableArray и добавьте к нему каждый символ, а затем используйте componentsJoinedByString: превратить массив в строку за один шаг в самом конце.

Должно сработать...

Другие вопросы по тегам