在调用之间释放变量
Posted
技术标签:
【中文标题】在调用之间释放变量【英文标题】:Variable getting released between calls 【发布时间】:2016-08-08 19:16:19 【问题描述】:我正在使用 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
变量,但要么我做错了,要么不起作用。
任何帮助将不胜感激。
【问题讨论】:
您使用的方法确实会返回一个新的NSString
对象。您使用的是 ARC 还是 MRC?
@Droppy 不管默认是什么。我从未将其配置为不同。
【参考方案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;
【讨论】:
那么现在你遇到了内存泄漏......如果你总是想要最后两个字符,那么为什么不使用static unichar lastTwoChars[2];
?
@Droppy 我没想到,谢谢。我编辑了答案。看起来对吗?
不,一点也不。你需要[text characterAtIndex:index]
,这里需要计算index
。
@Droppy 我最终早点弄清楚了。现在可以了。感谢您的帮助。以上是关于在调用之间释放变量的主要内容,如果未能解决你的问题,请参考以下文章