1

我正在使用 Logos/Theos 为 iOS 开发一个调整。

我需要始终存储用户输入的最后两个字符。

我的代码是:

static NSString *lastTwoChars = [[NSString alloc] init];
...
if (lastTwoChars.length < 2) {
    lastTwoChars = [lastTwoChars stringByAppendingString:text];
} else {
    lastTwoChars = [lastTwoChars stringByAppendingString:text];
    lastTwoChars = [lastTwoChars substringFromIndex:1];
}
...

(在这个范围内,text是他们在键盘上输入的最后一个字符)

这段代码工作正常,直到我按下第三个字符。经过很长时间的反复试验,我发现这是因为变量lastTwoChars被释放,变成了一个不同的对象。

我无法弄清楚如何防止对象被释放并更改为另一个对象。我已经尝试过retain该变量,但要么我做错了,要么这不起作用。

任何帮助将不胜感激。

4

1 回答 1

-1

好吧。我终于弄明白了。感谢 Droppy 提示问题。

我通过保留新字符串来修复它:

if (lastTwoChars.length < 2) {
    lastTwoChars = [[lastTwoChars stringByAppendingString:text] retain];
} else {
    lastTwoChars = [[lastTwoChars stringByAppendingString:text] retain];
    lastTwoChars = [[lastTwoChars substringFromIndex:1] retain];
}

我不知道stringByAppendingString并且substringFromIndex正在创建新NSString对象,所以再次感谢 Droppy。

编辑:我认为这可能是内存泄漏,但 Droppy 证实它是。

这是我的新代码:

if (lastTwoChars.length < 2)
{
    lastTwoChars[lastTwoChars.length] = (unichar) text;
}
else
{
    lastTwoChars[0] = lastTwoChars[1];
    lastTwoChars[1] = (unichar) text;
}
于 2016-08-08T23:20:35.323 回答