Предупреждение о нехватке памяти после внедрения 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 заставит его взорваться. Если я правильно помню, unichar
16-битный тип
Скорее всего, добавление этой строки создает кучу временных строк, которые не освобождаются до завершения метода.
Вы могли бы создать NSMutableArray
и добавьте к нему каждый символ, а затем используйте componentsJoinedByString:
превратить массив в строку за один шаг в самом конце.
Должно сработать...