【问题标题】: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 不管默认是什么。我从未将其配置为不同。

标签: ios objective-c theos logos


【解决方案1】:

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

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

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

我不知道 stringByAppendingStringsubstringFromIndex 正在创建新的 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 我最终早点弄清楚了。现在可以了。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2011-01-18
  • 2017-01-07
  • 1970-01-01
  • 2017-05-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-17
  • 1970-01-01
相关资源
最近更新 更多