2013-05-11 76 views
1

最近我添加了一个rot13函数到我的项目,所以我可以rot13一个字符串我想要的。示例代码是通过互联网找到的。在我旋转了一个字符串之后,我得到了一个低内存警告,并且100%确定这是由于腐烂函数引起的。在rot13之前没有低内存警告。 这里是我的代码: rot13.hRot13实现后的低内存警告

#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]; 

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

+0

这段代码是用ARC还是MRC编译的? – rmaddy 2013-05-11 18:10:25

+0

它是用ARC编译的。 – Theodoros80 2013-05-11 18:16:53

+0

然后没有什么可以发布的。 – rmaddy 2013-05-11 18:38:56

回答

3

对于字符串中的每个字符,您都通过字符串格式化处理器(慢速)并将单个字符附加到可变字符串(也很慢)。可能的是,其中一个操作是创建一个自动释放的字符串作为实现细节。结合逐字符操作,很容易导致内存压力。

关闭袖口更好的解决方案是制作一个可变的输入字符串副本,然后遍历字符,并随时替换每个字符。请注意,在非7位ASCII码的情况下,ROT13会失败; unicode会使它炸毁。如果我没有记错,unichar是一个16位类型。

1

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

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

应该工作...

+0

好的,我会尝试一下。谢谢你的回复和帮助。 – Theodoros80 2013-05-12 09:50:49