在调用之间释放变量

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

我不知道 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 我最终早点弄清楚了。现在可以了。感谢您的帮助。

以上是关于在调用之间释放变量的主要内容,如果未能解决你的问题,请参考以下文章

从 JavaScript 中的局部变量释放内存

如何理解闭包?

关于 pthread_exit 释放自动变量的困惑

jsp 中声明方法的使用

局部变量的存储类别--自动变量与静态局部变量

LR静态存储/动态存储/指针变量脚本说明