2011-09-20 33 views
1

我有一个全局的NSString变量,我在我的ViewController.m文件中声明了任何方法以外的内容,但不是在我的.h文件中。Objective-C:有关NSString和范围的问题

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

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

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

谢谢!

回答

1

方法getParameter:返回一个自动发布的NSString对象。

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

因为你永远不会保留那个对象,所以一旦它被自动释放,它就被处理掉了,你不能再使用它了。

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

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

请注意,如果您copyretain它,你必须在某个点后释放它,当你不需要它了,否则,你将有内存泄漏。

+0

是否所有方法返回对象autoreleased? – dee

+1

基本上任何没有命名为'alloc'或'copy'的方法(或那些像'allocWithZone'或'mutableCopy'这样的变体)都会返回一个自动释放对象。请参阅本指南获取更多信息:http://developer.apple.com/library/ios/#DOCUMENTATION/General/Conceptual/DevPedia-CocoaCore/MemoryManagement.html – filipe

+0

好的。谢谢!! – dee

1

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

你的第一个例子,你复制字符串,你现在有一个对象,当Autorelease Pool清理完成后,这个对象将不会被清理。

但是,请确保您的release对象在您的课程的dealloc方法中防止泄漏。