0

最近我在我的项目中添加了一个 rot13 函数,所以我可以 rot13 一个我想要的字符串。示​​例代码是在互联网上找到的。在我旋转了一个字符串之后,我收到了一个内存不足的警告,并且 100% 确定这是由于 rot 函数造成的。在 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

我像这样 rot13 我的字符串:

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

有什么帮助吗?我应该释放一些东西吗?为什么这个简单的任务调用内存不足警告?

4

2 回答 2

3

对于字符串中的每个字符,您都在运行字符串格式化处理器(慢)并将单个字符附加到可变字符串(也慢)。很可能,这些操作之一是创建某种自动释放的字符串作为实现细节。再加上逐字操作,很容易造成内存压力。

一个现成的更好的解决方案是制作输入字符串的可变副本,然后迭代字符,随时替换每个字符。注意,ROT13 面对非 7 位 ASCII 会惨败;unicode 会让它爆炸。如果我没记错的话,unichar是16位的类型。

于 2013-05-11T19:14:02.960 回答
1

所有这些字符串附加很可能会创建一堆临时字符串,这些字符串在方法完成之前不会被释放。

您可以创建一个NSMutableArray并将每个字符附加到它,然后componentsJoinedByString:在最后一步将数组转换为字符串。

应该管用...

于 2013-05-11T21:17:47.357 回答