实现Rot13后出现低内存警告



最近我添加了一个rot13函数到我的项目,所以我可以rot13我想要的字符串。示例代码是在互联网上找到的。就在我rot一个字符串后,我得到一个低内存警告,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

我的字符串是这样的:

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

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

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

一个更好的临时解决方案是创建一个可变的输入字符串副本,然后遍历字符,替换每个字符。请注意,ROT13在面对非7位ASCII时会惨败;Unicode会让它爆炸。如果我没记错的话,unichar是16位类型

所有这些字符串追加很可能会创建一堆临时字符串,直到方法完成才会释放。

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

应该工作……

相关内容

  • 没有找到相关文章

最新更新