我有一个全局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只是一个接受两个字符串并返回一个字符串的方法)。
谢谢!
答案 0 :(得分:1)
方法getParameter:
返回自动释放的NSString
对象。
这意味着该对象将在该运行循环结束时自动释放(当自动释放池耗尽时)。
因为你从未保留过该对象,所以一旦它被自动释放,它就会被释放,你就不能再使用了它。
通过执行copy
,您将创建该对象的保留副本,该副本在运行循环结束时不会自动释放。
如果您使用retain
:
menuString = [[self getParameter:url :@"Menu"] retain];
请注意,如果您copy
或retain
,则必须在稍后不再需要时将其释放,否则您将发生内存泄漏。
答案 1 :(得分:1)
[self getParameter:url :@"Menu"];
返回autoreleased
字符串对象。这意味着在Autorelease Pool的下一个周期中它将被释放。如果没有其他任何内容增加其保留计数(retain
或copy
调用),则会将其取消删除。一旦它被解除了并且你试图使用它就会崩溃。
您的第一个示例,您复制了现在有一个对象的字符串,当自动释放池清理时,该对象将不会被清除。
但是,请确保release
类dealloc
方法中的对象以防止泄漏。