Objective-C:关于NSString和范围的问题

时间:2011-09-20 18:41:13

标签: objective-c nsstring scope

我有一个全局NSString变量,我在我的ViewController.m文件中声明,在任何方法之外,但不在我的.h文件中。

NSString *menuString;

它在webViewDidFinishLoad内初始化,当我这样做时它会起作用

NSString *menu = [self getParameter:url :@"Menu"];
menuString = [menu copy];

但不是在我这样做的时候

NSString *menu = [self getParameter:url :@"Menu"];
menuString = menu;

menuString = [self getParameter:url :@"Menu"];

在这里,通过“它工作”我的意思是保存了值,我可以在其他方法中使用它。否则,在调试期间,它表示menuString超出范围。我想知道为什么它的行为会有所不同,具体取决于初始化。

(getParameter只是一个接受两个字符串并返回一个字符串的方法)。

谢谢!

2 个答案:

答案 0 :(得分:1)

方法getParameter:返回自动释放的NSString对象。

这意味着该对象将在该运行循环结束时自动释放(当自动释放池耗尽时)。

因为你从未保留过该对象,所以一旦它被自动释放,它就会被释放,你就不能再使用了它。

通过执行copy,您将创建该对象的保留副本,该副本在运行循环结束时不会自动释放。
如果您使用retain

,它也会有效
menuString = [[self getParameter:url :@"Menu"] retain];

请注意,如果您copyretain,则必须在稍后不再需要时将其释放,否则您将发生内存泄漏。

答案 1 :(得分:1)

[self getParameter:url :@"Menu"];返回autoreleased字符串对象。这意味着在Autorelease Pool的下一个周期中它将被释放。如果没有其他任何内容增加其保留计数(retaincopy调用),则会将其取消删除。一旦它被解除了并且你试图使用它就会崩溃。

您的第一个示例,您复制了现在有一个对象的字符串,当自动释放池清理时,该对象将不会被清除。

但是,请确保releasedealloc方法中的对象以防止泄漏。