最近我在我的项目中添加了一个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];
有任何帮助吗?我应该发布一些东西吗?为什么这个简单的任务会调用低内存警告?
答案 0 :(得分:3)
对于字符串中的每个字符,您正在遍历字符串格式化处理器(慢速)并将单个字符附加到可变字符串(也很慢)。可能,其中一个操作是创建一个自动释放的字符串作为实现细节。结合逐字符操作,很容易导致记忆压力。
关闭袖口更好的解决方案是制作输入字符串的可变副本,然后迭代字符,随时替换每个字符。请注意,面对非7位ASCII,ROT13将失败; unicode会让它爆炸。如果我没记错的话,unichar
是16位类型。
答案 1 :(得分:1)
所有附加的字符串很可能会创建一堆临时字符串,这些字符串在方法完成之前不会被释放。
您可以创建NSMutableArray
并将每个字符附加到其中,然后使用componentsJoinedByString:
在最后一步将数组转换为字符串。
应该工作......